perm filename TMP.PSC[MF,DEK] blob sn#761926 filedate 1984-07-18 generic text, type T, neo UTF8
{4:}{9:}{$C-,A+,D-,W+}{$C+,D:5,W+,Z:377777777777B}{$D:7}{:9}PROGRAM MF;
LABEL{6:}1,9998,9999;{:6}CONST{11:}MEMMAX=3000;MAXINTERNAL=50;
BUFSIZE=500;ERRORLINE=64;HALFERRORLIN=32;MAXPRINTLINE=72;
SCREENWIDTH=100;SCREENDEPTH=200;STACKSIZE=30;MAXSTRINGS=1500;
STRINGVACANC=8000;POOLSIZE=32000;MOVESIZE=5000;GFBUFSIZE=800;
FILENAMESIZE=23;POOLNAME='MF.POOL[MF,SYS]        ';PATHSIZE=100;
COUNTNAME='<!MF!>.TXT[TEX,SYS]    ';BISTACKSIZE=768;HEADERSIZE=100;
LIGTABLESIZE=300;MAXFONTDIMEN=50;{:11}TYPE{18:}ASCIICODE=0..127;{:18}
{24:}EIGHTBITS=0..255;ALPHAFILE=PACKED FILE OF CHAR;
BYTEFILE=PACKED FILE OF EIGHTBITS;{:24}{37:}POOLPOINTER=0..POOLSIZE;
STRNUMBER=0..MAXSTRINGS;{:37}{98:}SCALED=INTEGER;SMALLNUMBER=0..63;{:98}
{102:}FRACTION=INTEGER;{:102}{103:}ANGLE=INTEGER;{:103}{150:}
QUARTERWORD=0..255;HALFWORD=0..65535;TWOCHOICES=1..2;THREECHOICES=1..3;
TWOHALVES=PACKED RECORD RH:HALFWORD;CASE TWOCHOICES OF 1:(LH:HALFWORD);
2:(B0:QUARTERWORD;B1:QUARTERWORD);END;
FOURQUARTERS=PACKED RECORD B0:QUARTERWORD;B1:QUARTERWORD;B2:QUARTERWORD;
B3:QUARTERWORD;END;
MEMORYWORD=RECORD CASE THREECHOICES OF 1:(INT:INTEGER);2:(HH:TWOHALVES);
3:(QQQQ:FOURQUARTERS);END;WORDFILE=FILE OF MEMORYWORD;{:150}{181:}
COMMANDCODE=1..81;{:181}{519:}SCREENROW=0..SCREENDEPTH;
SCREENCOL=0..SCREENWIDTH;TRANSSPEC=ARRAY[SCREENROW]OF SCREENCOL;
PIXELCOLOR=0..1;{:519}{525:}WINDOWNUMBER=0..15;{:525}{577:}
INSTATERECOR=RECORD INDEXFIELD:QUARTERWORD;
STARTFIELD,LOCFIELD,LIMITFIELD,NAMEFIELD:HALFWORD;END;{:577}{1080:}
GFINDEX=0..GFBUFSIZE;PACKEDBYTES=PACKED ARRAY[GFINDEX]OF EIGHTBITS;
{:1080}VAR{13:}BAD:INTEGER;{:13}{20:}XORD:ARRAY[CHAR]OF ASCIICODE;
XCHR:ARRAY[ASCIICODE]OF CHAR;{:20}{25:}
NAMEOFFILE:PACKED ARRAY[1..FILENAMESIZE]OF CHAR;
NAMELENGTH:0..FILENAMESIZE;{:25}{29:}
BUFFER:ARRAY[0..BUFSIZE]OF ASCIICODE;FIRST:0..BUFSIZE;LAST:0..BUFSIZE;
MAXBUFSTACK:0..BUFSIZE;AUXBUF:ARRAY[0..70]OF CHAR;{:29}{38:}
STRPOOL:PACKED ARRAY[POOLPOINTER]OF ASCIICODE;
STRSTART:ARRAY[STRNUMBER]OF POOLPOINTER;POOLPTR:POOLPOINTER;
STRPTR:STRNUMBER;INITPOOLPTR:POOLPOINTER;INITSTRPTR:STRNUMBER;{:38}{42:}
STRREF:ARRAY[STRNUMBER]OF 0..127;{:42}{50:}POOLFILE:ALPHAFILE;{:50}{54:}
LOGFILE:ALPHAFILE;SELECTOR:0..5;DIG:ARRAY[0..22]OF 0..15;TALLY:INTEGER;
TERMOFFSET:0..MAXPRINTLINE;FILEOFFSET:0..MAXPRINTLINE;
TRICKBUF:ARRAY[0..ERRORLINE]OF ASCIICODE;TRICKCOUNT:INTEGER;
FIRSTCOUNT:INTEGER;{:54}{67:}INTERACTION:0..3;{:67}{70:}
DELETIONSALL:BOOLEAN;HISTORY:0..3;ERRORCOUNT:-1..100;{:70}{73:}
HELPLINE:ARRAY[0..5]OF STRNUMBER;HELPPTR:0..6;USEERRHELP:BOOLEAN;
ERRHELP:STRNUMBER;{:73}{89:}INTERRUPT:INTEGER;OKTOINTERRUP:BOOLEAN;{:89}
{95:}ARITHERROR:BOOLEAN;{:95}{123:}TWOTOTHE:ARRAY[0..30]OF INTEGER;
SPECLOG:ARRAY[1..28]OF INTEGER;{:123}{131:}
SPECATAN:ARRAY[1..26]OF ANGLE;{:131}{138:}NSIN,NCOS:FRACTION;{:138}
{142:}RANDOMS:ARRAY[0..54]OF FRACTION;JRANDOM:0..54;{:142}{152:}
TEMPPTR:HALFWORD;{:152}{153:}MEM:ARRAY[0..MEMMAX]OF MEMORYWORD;{:153}
{154:}VARUSED,DYNUSED:INTEGER;MAXVARUSED:INTEGER;{:154}{155:}
AVAIL:HALFWORD;MEMEND:HALFWORD;{:155}{160:}ROVER:HALFWORD;{:160}{173:}
FREE:PACKED ARRAY[0..MEMMAX]OF BOOLEAN;
WASFREE:PACKED ARRAY[0..MEMMAX]OF BOOLEAN;WASMEMEND:HALFWORD;
PANICKING:BOOLEAN;{:173}{184:}INTERNAL:ARRAY[1..MAXINTERNAL]OF SCALED;
INTNAME:ARRAY[1..MAXINTERNAL]OF STRNUMBER;INTPTR:31..MAXINTERNAL;{:184}
{190:}OLDSETTING:0..5;{:190}{192:}
CHARCLASS:ARRAY[ASCIICODE]OF ASCIICODE;{:192}{194:}HASHUSED:HALFWORD;
STCOUNT:INTEGER;{:194}{195:}HASH:ARRAY[1..2243]OF TWOHALVES;
EQTB:ARRAY[1..2243]OF TWOHALVES;{:195}{222:}
BIGNODESIZE:ARRAY[14..15]OF SMALLNUMBER;{:222}{241:}SAVEPTR:HALFWORD;
{:241}{260:}PATHTAIL:HALFWORD;{:260}{273:}
DELTAX,DELTAY,DELTA:ARRAY[0..PATHSIZE]OF SCALED;
PSI:ARRAY[1..PATHSIZE]OF ANGLE;{:273}{277:}
THETA:ARRAY[0..PATHSIZE]OF ANGLE;UU:ARRAY[0..PATHSIZE]OF FRACTION;
VV:ARRAY[0..PATHSIZE]OF ANGLE;WW:ARRAY[0..PATHSIZE]OF FRACTION;{:277}
{292:}ST,CT,SF,CF:FRACTION;{:292}{302:}
MOVE:ARRAY[0..MOVESIZE]OF INTEGER;MOVEPTR:0..MOVESIZE;{:302}{303:}
BISECTSTACK:ARRAY[0..BISTACKSIZE]OF INTEGER;BISECTPTR:0..BISTACKSIZE;
{:303}{321:}CUREDGES:HALFWORD;CURWT:INTEGER;{:321}{357:}TRACEX:INTEGER;
TRACEY:INTEGER;TRACEYY:INTEGER;{:357}{374:}CURX,CURY:SCALED;{:374}{382:}
WINDINGNUMBE:INTEGER;{:382}{403:}OCTANTNUMBER:ARRAY[1..8]OF 1..8;
OCTANTCODE:ARRAY[1..8]OF 1..8;{:403}{415:}
XCORR,YCORR:ARRAY[1..8]OF 0..1;XYCORR:ARRAY[1..8]OF 0..1;{:415}{422:}
CURM,CURN,CURD,CURDD:INTEGER;OCTANT:1..8;
GOOD1,GOOD2,GOOD3:ARRAY[1..8]OF INTEGER;{:422}{465:}
ENVMOVE:ARRAY[0..MOVESIZE]OF INTEGER;{:465}{510:}CURT,CURTT:INTEGER;
{:510}{520:}{SCREENPIXEL:ARRAY[SCREENROW,SCREENCOL]OF PIXELCOLOR;}{:520}
{523:}SCREENSTARTE:BOOLEAN;SCREENOK:BOOLEAN;{:523}{526:}
WINDOWOPEN:ARRAY[WINDOWNUMBER]OF BOOLEAN;
LEFTCOL:ARRAY[WINDOWNUMBER]OF SCREENCOL;
RIGHTCOL:ARRAY[WINDOWNUMBER]OF SCREENCOL;
TOPROW:ARRAY[WINDOWNUMBER]OF SCREENROW;
BOTROW:ARRAY[WINDOWNUMBER]OF SCREENROW;
MWINDOW:ARRAY[WINDOWNUMBER]OF INTEGER;
NWINDOW:ARRAY[WINDOWNUMBER]OF INTEGER;
WINDOWTIME:ARRAY[WINDOWNUMBER]OF INTEGER;{:526}{533:}
ROWTRANSITIO:TRANSSPEC;{:533}{545:}FIXNEEDED:BOOLEAN;WATCHCOEFS:BOOLEAN;
DEPFINAL:HALFWORD;{:545}{574:}CURCMD:EIGHTBITS;CURMOD:INTEGER;
CURSYM:HALFWORD;{:574}{578:}
INPUTSTACK:ARRAY[0..STACKSIZE]OF INSTATERECOR;INPUTPTR:0..STACKSIZE;
MAXINSTACK:0..STACKSIZE;CURINPUT:INSTATERECOR;{:578}{581:}INOPEN:0..6;
INPUTFILE:ARRAY[1..6]OF ALPHAFILE;LINE:INTEGER;
LINESTACK:ARRAY[1..6]OF INTEGER;PAGE:INTEGER;
PAGESTACK:ARRAY[1..6]OF INTEGER;{:581}{583:}
PARAMSTACK:ARRAY[0..150]OF HALFWORD;PARAMPTR:0..150;
MAXPARAMSTAC:INTEGER;{:583}{584:}FILEPTR:0..STACKSIZE;{:584}{608:}
SCANNERSTATU:0..6;WARNINGINFO:INTEGER;{:608}{628:}FORCEEOF:BOOLEAN;
{:628}{685:}CONDPTR:HALFWORD;IFLIMIT:0..4;CURIF:SMALLNUMBER;
IFLINE:INTEGER;{:685}{699:}LOOPPTR:HALFWORD;{:699}{713:}
CURNAME:STRNUMBER;CURAREA:STRNUMBER;CUREXT:STRNUMBER;{:713}{714:}
AREADELIMITE:POOLPOINTER;EXTDELIMITER:POOLPOINTER;{:714}{721:}
MFBASEDEFAUL:PACKED ARRAY[1..18]OF CHAR;{:721}{728:}JOBNAME:STRNUMBER;
LOGNAME:STRNUMBER;{:728}{736:}GFFILE:BYTEFILE;OUTPUTFILENA:STRNUMBER;
{:736}{741:}CURTYPE:SMALLNUMBER;CUREXP:INTEGER;{:741}{761:}
VARFLAG:0..81;{:761}{889:}TXX,TXY,TYX,TYY,TX,TY:SCALED;{:889}{1007:}
STARTSYM:HALFWORD;{:1007}{1014:}LONGHELPSEEN:BOOLEAN;{:1014}{1017:}
TFMFILE:BYTEFILE;METRICFILENA:STRNUMBER;{:1017}{1026:}BC,EC:EIGHTBITS;
TFMWIDTH:ARRAY[EIGHTBITS]OF SCALED;TFMHEIGHT:ARRAY[EIGHTBITS]OF SCALED;
TFMDEPTH:ARRAY[EIGHTBITS]OF SCALED;
TFMITALCORR:ARRAY[EIGHTBITS]OF SCALED;
CHAREXISTS:ARRAY[EIGHTBITS]OF BOOLEAN;CHARTAG:ARRAY[EIGHTBITS]OF 0..3;
CHARREMAINDE:ARRAY[EIGHTBITS]OF EIGHTBITS;
HEADERBYTE:ARRAY[1..HEADERSIZE]OF-1..255;
LIGKERN:ARRAY[0..LIGTABLESIZE]OF FOURQUARTERS;NL:0..LIGTABLESIZE;
KERN:ARRAY[EIGHTBITS]OF SCALED;NK:0..256;
EXTEN:ARRAY[EIGHTBITS]OF FOURQUARTERS;NE:0..256;
PARAM:ARRAY[1..MAXFONTDIMEN]OF SCALED;NP:0..MAXFONTDIMEN;
NW,NH,ND,NI:0..256;{:1026}{1049:}PERTURBATION:SCALED;{:1049}{1055:}
DIMENHEAD:ARRAY[1..4]OF HALFWORD;{:1055}{1066:}MAXTFMDIMEN:SCALED;
TFMCHANGED:INTEGER;{:1066}{1078:}GFMINX,GFMAXX,GFMINY,GFMAXY:INTEGER;
GFPREVPTR:INTEGER;TOTALCHARS:INTEGER;CHARPTR:ARRAY[EIGHTBITS]OF INTEGER;
GFWIDTH:ARRAY[EIGHTBITS]OF INTEGER;{:1078}{1081:}GFBUF:PACKEDBYTES;
HALFBUF:GFINDEX;GFLIMIT:GFINDEX;GFPTR:GFINDEX;GFOFFSET:INTEGER;{:1081}
{1108:}BASEIDENT:STRNUMBER;{:1108}{1113:}BASEFILE:WORDFILE;{:1113}
{1128:}READYALREADY:INTEGER;{:1128}{1139:}PSEUDOTYPEIN:STRNUMBER;{:1139}
{1142:}COUNTFILE:ALPHAFILE;{:1142}{1143:}
HACK,MEMRY:PACKED RECORD CASE INTEGER OF 0:(XX:0..777777B;P:↑INTEGER);
1:(Z:INTEGER);2:(LH:0..777777B;RH:0..777777B);
3:(SIXBIT:PACKED ARRAY[1..6]OF 0..63)END;NUMCOUNTS:INTEGER;
JOBHRL:INTEGER;{:1143}{1150:}ESCBREAK:ARRAY[1..1]OF INTEGER;{:1150}
PROCEDURE INITIALIZE;VAR{19:}I:0..127;{:19}{124:}K:INTEGER;{:124}
BEGIN{21:}XCHR[32]:=' ';XCHR[33]:='!';XCHR[34]:='"';XCHR[35]:='#';
XCHR[36]:='$';XCHR[37]:='%';XCHR[38]:='&';XCHR[39]:='''';XCHR[40]:='(';
XCHR[41]:=')';XCHR[42]:='*';XCHR[43]:='+';XCHR[44]:=',';XCHR[45]:='-';
XCHR[46]:='.';XCHR[47]:='/';XCHR[48]:='0';XCHR[49]:='1';XCHR[50]:='2';
XCHR[51]:='3';XCHR[52]:='4';XCHR[53]:='5';XCHR[54]:='6';XCHR[55]:='7';
XCHR[56]:='8';XCHR[57]:='9';XCHR[58]:=':';XCHR[59]:=';';XCHR[60]:='<';
XCHR[61]:='=';XCHR[62]:='>';XCHR[63]:='?';XCHR[64]:='@';XCHR[65]:='A';
XCHR[66]:='B';XCHR[67]:='C';XCHR[68]:='D';XCHR[69]:='E';XCHR[70]:='F';
XCHR[71]:='G';XCHR[72]:='H';XCHR[73]:='I';XCHR[74]:='J';XCHR[75]:='K';
XCHR[76]:='L';XCHR[77]:='M';XCHR[78]:='N';XCHR[79]:='O';XCHR[80]:='P';
XCHR[81]:='Q';XCHR[82]:='R';XCHR[83]:='S';XCHR[84]:='T';XCHR[85]:='U';
XCHR[86]:='V';XCHR[87]:='W';XCHR[88]:='X';XCHR[89]:='Y';XCHR[90]:='Z';
XCHR[91]:='[';XCHR[92]:='\';XCHR[93]:=']';XCHR[94]:='↑';XCHR[95]:='_';
XCHR[96]:='`';XCHR[97]:='a';XCHR[98]:='b';XCHR[99]:='c';XCHR[100]:='d';
XCHR[101]:='e';XCHR[102]:='f';XCHR[103]:='g';XCHR[104]:='h';
XCHR[105]:='i';XCHR[106]:='j';XCHR[107]:='k';XCHR[108]:='l';
XCHR[109]:='m';XCHR[110]:='n';XCHR[111]:='o';XCHR[112]:='p';
XCHR[113]:='q';XCHR[114]:='r';XCHR[115]:='s';XCHR[116]:='t';
XCHR[117]:='u';XCHR[118]:='v';XCHR[119]:='w';XCHR[120]:='x';
XCHR[121]:='y';XCHR[122]:='z';XCHR[123]:='{';XCHR[124]:='|';
XCHR[125]:='}';XCHR[126]:='~';XCHR[0]:=' ';XCHR[127]:=' ';{:21}{22:}
FOR I:=1 TO 31 DO XCHR[I]:=CHR(I);XCHR[24]:=CHR(95);XCHR[26]:=CHR(27);
XCHR[27]:=CHR(126);{:22}{23:}FOR I:=0 TO 127 DO XORD[CHR(I)]:=127;
FOR I:=1 TO 126 DO XORD[XCHR[I]]:=I;XORD[CHR(9)]:=32;{:23}{68:}
INTERACTION:=3;{:68}{71:}DELETIONSALL:=TRUE;ERRORCOUNT:=0;{:71}{74:}
HELPPTR:=0;USEERRHELP:=FALSE;ERRHELP:=0;{:74}{90:}INTERRUPT:=0;
OKTOINTERRUP:=TRUE;{:90}{96:}ARITHERROR:=FALSE;{:96}{125:}
TWOTOTHE[0]:=1;FOR K:=1 TO 30 DO TWOTOTHE[K]:=2*TWOTOTHE[K-1];
SPECLOG[1]:=93032640;SPECLOG[2]:=38612034;SPECLOG[3]:=17922280;
SPECLOG[4]:=8662214;SPECLOG[5]:=4261238;SPECLOG[6]:=2113709;
SPECLOG[7]:=1052693;SPECLOG[8]:=525315;SPECLOG[9]:=262400;
SPECLOG[10]:=131136;SPECLOG[11]:=65552;SPECLOG[12]:=32772;
SPECLOG[13]:=16385;FOR K:=14 TO 27 DO SPECLOG[K]:=TWOTOTHE[27-K];
SPECLOG[28]:=1;{:125}{132:}SPECATAN[1]:=27855475;SPECATAN[2]:=14718068;
SPECATAN[3]:=7471121;SPECATAN[4]:=3750058;SPECATAN[5]:=1876857;
SPECATAN[6]:=938658;SPECATAN[7]:=469357;SPECATAN[8]:=234682;
SPECATAN[9]:=117342;SPECATAN[10]:=58671;SPECATAN[11]:=29335;
SPECATAN[12]:=14668;SPECATAN[13]:=7334;SPECATAN[14]:=3667;
SPECATAN[15]:=1833;SPECATAN[16]:=917;SPECATAN[17]:=458;
SPECATAN[18]:=229;SPECATAN[19]:=115;SPECATAN[20]:=57;SPECATAN[21]:=29;
SPECATAN[22]:=14;SPECATAN[23]:=7;SPECATAN[24]:=4;SPECATAN[25]:=2;
SPECATAN[26]:=1;{:132}{174:}WASMEMEND:=0;PANICKING:=FALSE;{:174}{185:}
FOR K:=1 TO 31 DO INTERNAL[K]:=0;INTPTR:=31;{:185}{193:}
FOR K:=48 TO 57 DO CHARCLASS[K]:=0;CHARCLASS[46]:=1;
FOR K:=0 TO 32 DO CHARCLASS[K]:=2;CHARCLASS[24]:=10;CHARCLASS[26]:=10;
CHARCLASS[28]:=10;CHARCLASS[29]:=10;CHARCLASS[12]:=20;CHARCLASS[127]:=2;
CHARCLASS[37]:=3;CHARCLASS[34]:=4;CHARCLASS[44]:=5;CHARCLASS[59]:=6;
CHARCLASS[40]:=7;CHARCLASS[41]:=8;FOR K:=65 TO 90 DO CHARCLASS[K]:=9;
FOR K:=97 TO 122 DO CHARCLASS[K]:=9;CHARCLASS[95]:=9;CHARCLASS[60]:=10;
CHARCLASS[61]:=10;CHARCLASS[62]:=10;CHARCLASS[58]:=10;
CHARCLASS[124]:=10;CHARCLASS[96]:=11;CHARCLASS[39]:=11;
CHARCLASS[43]:=12;CHARCLASS[45]:=12;CHARCLASS[47]:=13;CHARCLASS[42]:=13;
CHARCLASS[92]:=13;CHARCLASS[33]:=14;CHARCLASS[63]:=14;CHARCLASS[35]:=15;
CHARCLASS[38]:=15;CHARCLASS[64]:=15;CHARCLASS[36]:=15;CHARCLASS[94]:=16;
CHARCLASS[126]:=16;CHARCLASS[91]:=17;CHARCLASS[93]:=18;
CHARCLASS[123]:=19;CHARCLASS[125]:=19;{:193}{196:}HASH[1].LH:=0;
HASH[1].RH:=0;EQTB[1].LH:=39;EQTB[1].RH:=0;
FOR K:=2 TO 2243 DO BEGIN HASH[K]:=HASH[1];EQTB[K]:=EQTB[1];END;{:196}
{223:}BIGNODESIZE[14]:=12;BIGNODESIZE[15]:=4;{:223}{242:}SAVEPTR:=0;
{:242}{404:}OCTANTCODE[1]:=1;OCTANTCODE[2]:=5;OCTANTCODE[3]:=6;
OCTANTCODE[4]:=2;OCTANTCODE[5]:=4;OCTANTCODE[6]:=8;OCTANTCODE[7]:=7;
OCTANTCODE[8]:=3;FOR K:=1 TO 8 DO OCTANTNUMBER[OCTANTCODE[K]]:=K;{:404}
{416:}XCORR[1]:=0;YCORR[1]:=0;XYCORR[1]:=0;XCORR[5]:=0;YCORR[5]:=0;
XYCORR[5]:=1;XCORR[6]:=0;YCORR[6]:=1;XYCORR[6]:=0;XCORR[2]:=1;
YCORR[2]:=0;XYCORR[2]:=1;XCORR[4]:=1;YCORR[4]:=1;XYCORR[4]:=1;
XCORR[8]:=1;YCORR[8]:=1;XYCORR[8]:=0;XCORR[7]:=1;YCORR[7]:=0;
XYCORR[7]:=1;XCORR[3]:=0;YCORR[3]:=1;XYCORR[3]:=0;{:416}{423:}
FOR K:=1 TO 8 DO BEGIN GOOD1[K]:=XYCORR[K]-XCORR[K]+YCORR[K];
GOOD2[K]:=32768-YCORR[K]+GOOD1[K];
IF ODD(K)THEN GOOD3[K]:=1 ELSE GOOD3[K]:=2;END;{:423}{434:}
MEM[3].HH.LH:=0;MEM[3].HH.RH:=0;MEM[4].HH.LH:=1;MEM[4].HH.RH:=0;
FOR K:=5 TO 11 DO MEM[K]:=MEM[4];MEM[12].INT:=0;MEM[0].HH.RH:=0;
MEM[0].HH.LH:=0;MEM[1].INT:=0;MEM[2].INT:=0;{:434}{524:}
SCREENSTARTE:=FALSE;SCREENOK:=FALSE;{:524}{527:}
FOR K:=0 TO 15 DO BEGIN WINDOWOPEN[K]:=FALSE;WINDOWTIME[K]:=0;END;{:527}
{546:}FIXNEEDED:=FALSE;WATCHCOEFS:=TRUE;{:546}{686:}CONDPTR:=0;
IFLIMIT:=0;CURIF:=0;IFLINE:=0;{:686}{722:}
MFBASEDEFAUL:='PLAIN.bas[tex,sys]';{:722}{742:}CUREXP:=0;{:742}{762:}
VARFLAG:=0;{:762}{1008:}STARTSYM:=0;{:1008}{1015:}LONGHELPSEEN:=FALSE;
{:1015}{1027:}FOR K:=0 TO 255 DO BEGIN TFMWIDTH[K]:=0;TFMHEIGHT[K]:=0;
TFMDEPTH[K]:=0;TFMITALCORR[K]:=0;CHAREXISTS[K]:=FALSE;CHARTAG[K]:=0;
CHARREMAINDE[K]:=0;END;FOR K:=1 TO HEADERSIZE DO HEADERBYTE[K]:=-1;
BC:=255;EC:=0;NL:=0;NK:=0;NE:=0;NP:=0;{:1027}{1079:}GFPREVPTR:=0;
TOTALCHARS:=0;{:1079}{1082:}HALFBUF:=GFBUFSIZE DIV 2;GFLIMIT:=GFBUFSIZE;
GFPTR:=0;GFOFFSET:=0;{:1082}{1109:}BASEIDENT:=0;{:1109}{1140:}
PSEUDOTYPEIN:=0;PAGE:=0;{:1140}END;{57:}PROCEDURE PRINTLN;
BEGIN CASE SELECTOR OF 3:BEGIN WRITELN(TTY);WRITELN(LOGFILE);
TERMOFFSET:=0;FILEOFFSET:=0;END;2:BEGIN WRITELN(LOGFILE);FILEOFFSET:=0;
END;1:BEGIN WRITELN(TTY);TERMOFFSET:=0;END;0,4,5:;END;END;{:57}{58:}
PROCEDURE PRINTCHAR(S:ASCIICODE);
BEGIN CASE SELECTOR OF 3:BEGIN WRITE(TTY,XCHR[S]);
WRITE(LOGFILE,XCHR[S]);TERMOFFSET:=TERMOFFSET+1;
FILEOFFSET:=FILEOFFSET+1;
IF TERMOFFSET=MAXPRINTLINE THEN BEGIN WRITELN(TTY);TERMOFFSET:=0;END;
IF FILEOFFSET=MAXPRINTLINE THEN BEGIN WRITELN(LOGFILE);FILEOFFSET:=0;
END;END;2:BEGIN WRITE(LOGFILE,XCHR[S]);FILEOFFSET:=FILEOFFSET+1;
IF FILEOFFSET=MAXPRINTLINE THEN PRINTLN;END;1:BEGIN WRITE(TTY,XCHR[S]);
TERMOFFSET:=TERMOFFSET+1;IF TERMOFFSET=MAXPRINTLINE THEN PRINTLN;END;0:;
4:IF TALLY<TRICKCOUNT THEN TRICKBUF[TALLY MOD ERRORLINE]:=S;
5:BEGIN IF POOLPTR<POOLSIZE THEN BEGIN STRPOOL[POOLPTR]:=S;
POOLPTR:=POOLPTR+1;END;END;END;TALLY:=TALLY+1;END;{:58}{59:}
PROCEDURE PRINT(S:INTEGER);VAR J:POOLPOINTER;
BEGIN IF(S<0)OR(S>=STRPTR)THEN S:=131;J:=STRSTART[S];
WHILE J<STRSTART[S+1]DO BEGIN PRINTCHAR(STRPOOL[J]);J:=J+1;END;END;{:59}
{61:}PROCEDURE PRINTNL(S:STRNUMBER);
BEGIN IF((TERMOFFSET>0)AND(ODD(SELECTOR)))OR((FILEOFFSET>0)AND(SELECTOR
>=2))THEN PRINTLN;PRINT(S);END;{:61}{62:}
PROCEDURE PRINTTHEDIGS(K:EIGHTBITS);BEGIN WHILE K>0 DO BEGIN K:=K-1;
IF DIG[K]<10 THEN PRINTCHAR(48+DIG[K])ELSE PRINTCHAR(55+DIG[K]);END;END;
{:62}{63:}PROCEDURE PRINTINT(N:INTEGER);VAR K:0..23;M:INTEGER;
BEGIN K:=0;IF N<0 THEN BEGIN PRINTCHAR(45);
IF N>-100000000 THEN N:=-N ELSE BEGIN M:=-1-N;N:=M DIV 10;
M:=(M MOD 10)+1;K:=1;IF M<10 THEN DIG[0]:=M ELSE BEGIN DIG[0]:=0;N:=N+1;
END;END;END;REPEAT DIG[K]:=N MOD 10;N:=N DIV 10;K:=K+1;UNTIL N=0;
PRINTTHEDIGS(K);END;{:63}{100:}PROCEDURE PRINTSCALED(S:SCALED);
VAR DELTA:SCALED;BEGIN IF S<0 THEN BEGIN PRINTCHAR(45);S:=-S;END;
PRINTINT(S DIV 65536);S:=10*(S MOD 65536)+5;
IF S<>5 THEN BEGIN DELTA:=10;PRINTCHAR(46);
REPEAT IF DELTA>65536 THEN S:=S+32768-(DELTA DIV 2);
PRINTCHAR(48+(S DIV 65536));S:=10*(S MOD 65536);DELTA:=DELTA*10;
UNTIL S<=DELTA;END;END;{:100}{101:}PROCEDURE PRINTTWO(X,Y:SCALED);
BEGIN PRINTCHAR(40);PRINTSCALED(X);PRINTCHAR(44);PRINTSCALED(Y);
PRINTCHAR(41);END;{:101}{182:}PROCEDURE PRINTTYPE(T:SMALLNUMBER);
BEGIN CASE T OF 1:PRINT(197);2:PRINT(198);3:PRINT(199);4:PRINT(200);
5:PRINT(201);6:PRINT(202);7:PRINT(203);8:PRINT(204);9:PRINT(205);
10:PRINT(206);11:PRINT(207);12:PRINT(208);13:PRINT(209);14:PRINT(210);
15:PRINT(211);16:PRINT(212);17:PRINT(213);18:PRINT(214);19:PRINT(215);
20:PRINT(216);21:PRINT(217);22:PRINT(218);23:PRINT(219);24:PRINT(220);
OTHERS:PRINT(221)END;END;{:182}{189:}PROCEDURE BEGINDIAGNOS;
BEGIN OLDSETTING:=SELECTOR;IF HISTORY=0 THEN HISTORY:=1;
IF(INTERNAL[11]<=0)AND(SELECTOR=3)THEN SELECTOR:=SELECTOR-1;END;
PROCEDURE ENDDIAGNOSTI(BLANKLINE:BOOLEAN);BEGIN PRINTNL(311);
IF BLANKLINE THEN PRINTLN;SELECTOR:=OLDSETTING;END;{:189}{191:}
PROCEDURE PRINTDIAGNOS(S,T:STRNUMBER);BEGIN BEGINDIAGNOS;PRINTNL(S);
PRINT(312);PRINTINT(LINE);PRINT(T);PRINTCHAR(58);END;{:191}{719:}
PROCEDURE PRINTFILENAM(N,A,E:INTEGER);BEGIN PRINT(N);PRINT(E);PRINT(A);
END;{:719}{33:}FUNCTION INSKP0:BOOLEAN;EXTERN;PROCEDURE WAKEUPTERMIN;
VAR VAL:INTEGER;SUCCESS:BOOLEAN;BEGIN BEGIN IF INSKP0 THEN END;
ESCBREAK[1]:=536870912+ORD('N');CALLI(131153,-1,ESCBREAK,VAL,SUCCESS);
END;{:33}{72:}PROCEDURE NORMALIZESEL;FORWARD;PROCEDURE GETNEXT;FORWARD;
PROCEDURE TERMINPUT;FORWARD;PROCEDURE SHOWCONTEXT;FORWARD;
PROCEDURE BEGINFILEREA;FORWARD;PROCEDURE OPENLOGFILE;FORWARD;
PROCEDURE CLOSEFILESAN;FORWARD;PROCEDURE CLEARFORERRO;FORWARD;
PROCEDURE DEBUGHELP;FORWARD;{43:}PROCEDURE FLUSHSTRING(S:STRNUMBER);
BEGIN IF S<STRPTR-1 THEN STRREF[S]:=0 ELSE REPEAT STRPTR:=STRPTR-1;
UNTIL STRREF[STRPTR-1]<>0;POOLPTR:=STRSTART[STRPTR];END;{:43}{:72}{75:}
PROCEDURE JUMPOUT;BEGIN GOTO 9998;END;{:75}{76:}PROCEDURE ERROR;
LABEL 22,10;VAR C:ASCIICODE;S1,S2,S3:INTEGER;
BEGIN IF HISTORY<2 THEN HISTORY:=2;PRINTCHAR(46);SHOWCONTEXT;
IF INTERACTION=3 THEN{77:}WHILE TRUE DO BEGIN 22:CLEARFORERRO;
BEGIN BEGIN IF INSKP0 THEN END;PRINT(135);TERMINPUT;END;
IF LAST=FIRST THEN GOTO 10;C:=BUFFER[FIRST];IF C>=97 THEN C:=C-32;{78:}
CASE C OF 49,50,51,52,53,54,55,56,57:IF DELETIONSALL THEN{82:}
BEGIN S1:=CURCMD;S2:=CURMOD;S3:=CURSYM;OKTOINTERRUP:=FALSE;
IF(LAST>FIRST+1)AND(BUFFER[FIRST+1]>=48)AND(BUFFER[FIRST+1]<=57)THEN C:=
C*10+BUFFER[FIRST+1]-48*11 ELSE C:=C-48;WHILE C>0 DO BEGIN GETNEXT;
{690:}
IF CURCMD=40 THEN BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1
THEN STRREF[CURMOD]:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END{:690}
;C:=C-1;END;CURCMD:=S1;CURMOD:=S2;CURSYM:=S3;OKTOINTERRUP:=TRUE;
BEGIN HELPPTR:=2;HELPLINE[1]:=150;HELPLINE[0]:=151;END;SHOWCONTEXT;
GOTO 22;END{:82};68:BEGIN DEBUGHELP;GOTO 22;END;
69,84:IF FILEPTR>0 THEN BEGIN SELECTOR:=5;POOLPTR:=STRSTART[STRPTR];
PRINT(136);PRINT(INPUTSTACK[FILEPTR].NAMEFIELD);PRINTCHAR(47);
PRINTINT(PAGE);PRINT(137);PRINTINT(LINE);PRINTCHAR(108);PRINTCHAR(13);
IF STRPTR<MAXSTRINGS THEN BEGIN PSEUDOTYPEIN:=STRPTR;STRPTR:=STRPTR+1;
STRSTART[STRPTR]:=POOLPTR;END;SELECTOR:=3;INTERACTION:=2;JUMPOUT;END;
72:{83:}BEGIN IF USEERRHELP THEN BEGIN PRINT(ERRHELP);USEERRHELP:=FALSE;
END ELSE BEGIN IF HELPPTR=0 THEN BEGIN HELPPTR:=2;HELPLINE[1]:=152;
HELPLINE[0]:=153;END;REPEAT HELPPTR:=HELPPTR-1;PRINT(HELPLINE[HELPPTR]);
PRINTLN;UNTIL HELPPTR=0;END;BEGIN HELPPTR:=4;HELPLINE[3]:=154;
HELPLINE[2]:=153;HELPLINE[1]:=155;HELPLINE[0]:=156;END;GOTO 22;END{:83};
73:{81:}BEGIN BEGINFILEREA;
IF LAST>FIRST+1 THEN BEGIN CURINPUT.LOCFIELD:=FIRST+1;BUFFER[FIRST]:=32;
END ELSE BEGIN BEGIN BEGIN IF INSKP0 THEN END;PRINT(149);TERMINPUT;END;
CURINPUT.LOCFIELD:=FIRST;END;FIRST:=LAST+1;CURINPUT.LIMITFIELD:=LAST;
GOTO 10;END{:81};81,82,83:{80:}BEGIN ERRORCOUNT:=0;INTERACTION:=0+C-81;
PRINT(144);CASE C OF 81:BEGIN PRINT(145);SELECTOR:=SELECTOR-1;END;
82:PRINT(146);83:PRINT(147);END;PRINT(148);PRINTLN;BREAK(TTY);GOTO 10;
END{:80};88:BEGIN INTERACTION:=2;JUMPOUT;END;OTHERS:END;{79:}
BEGIN PRINT(138);PRINTNL(139);PRINTNL(140);IF FILEPTR>0 THEN PRINT(141);
IF DELETIONSALL THEN PRINTNL(142);PRINTNL(143);END{:79}{:78};END{:77};
ERRORCOUNT:=ERRORCOUNT+1;IF ERRORCOUNT=100 THEN BEGIN PRINTNL(134);
HISTORY:=3;JUMPOUT;END;{84:}IF INTERACTION>0 THEN SELECTOR:=SELECTOR-1;
IF USEERRHELP THEN PRINTNL(ERRHELP)ELSE WHILE HELPPTR>0 DO BEGIN HELPPTR
:=HELPPTR-1;PRINTNL(HELPLINE[HELPPTR]);END;PRINTLN;
IF INTERACTION>0 THEN SELECTOR:=SELECTOR+1;PRINTLN{:84};10:END;{:76}
{86:}PROCEDURE FATALERROR(S:STRNUMBER);BEGIN NORMALIZESEL;
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(157);END;
BEGIN HELPPTR:=1;HELPLINE[0]:=S;END;
BEGIN IF INTERACTION=3 THEN INTERACTION:=2;ERROR;
IF INTERACTION>0 THEN DEBUGHELP;HISTORY:=3;JUMPOUT;END;END;{:86}{87:}
PROCEDURE OVERFLOW(S:STRNUMBER;N:INTEGER);BEGIN NORMALIZESEL;
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(158);END;
PRINT(S);PRINTCHAR(61);PRINTINT(N);PRINTCHAR(93);BEGIN HELPPTR:=2;
HELPLINE[1]:=159;HELPLINE[0]:=160;END;
BEGIN IF INTERACTION=3 THEN INTERACTION:=2;ERROR;
IF INTERACTION>0 THEN DEBUGHELP;HISTORY:=3;JUMPOUT;END;END;{:87}{88:}
PROCEDURE CONFUSION(S:STRNUMBER);BEGIN NORMALIZESEL;
IF HISTORY<2 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(161);END;PRINT(S);PRINTCHAR(41);BEGIN HELPPTR:=1;
HELPLINE[0]:=162;END;
END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(163);END;BEGIN HELPPTR:=2;HELPLINE[1]:=164;HELPLINE[0]:=165;END;
END;BEGIN IF INTERACTION=3 THEN INTERACTION:=2;ERROR;
IF INTERACTION>0 THEN DEBUGHELP;HISTORY:=3;JUMPOUT;END;END;{:88}{:4}
{26:}FUNCTION ERSTAT(VAR F:FILE):INTEGER;EXTERN;
FUNCTION AOPENIN(VAR F:ALPHAFILE):BOOLEAN;
BEGIN RESET(F,NAMEOFFILE,'/E/O/N:9');AOPENIN:=ERSTAT(F)MOD 8192=0;END;
FUNCTION AOPENOUT(VAR F:ALPHAFILE):BOOLEAN;
BEGIN REWRITE(F,NAMEOFFILE,'/O/N:2');AOPENOUT:=ERSTAT(F)MOD 8192=0;END;
FUNCTION BOPENIN(VAR F:BYTEFILE):BOOLEAN;
BEGIN RESET(F,NAMEOFFILE,'/B:8/O/N:2');BOPENIN:=ERSTAT(F)MOD 8192=0;END;
FUNCTION BOPENOUT(VAR F:BYTEFILE):BOOLEAN;
BEGIN REWRITE(F,NAMEOFFILE,'/O/N:9');BOPENOUT:=ERSTAT(F)MOD 8192=0;END;
FUNCTION TFMBOPENOUT(VAR F:BYTEFILE):BOOLEAN;
BEGIN REWRITE(F,NAMEOFFILE,'/B:8/O');TFMBOPENOUT:=ERSTAT(F)MOD 8192=0;
END;FUNCTION WOPENIN(VAR F:WORDFILE):BOOLEAN;
BEGIN RESET(F,NAMEOFFILE,'/O/N:9');WOPENIN:=ERSTAT(F)MOD 8192=0;END;
FUNCTION WOPENOUT(VAR F:WORDFILE):BOOLEAN;
BEGIN REWRITE(F,NAMEOFFILE,'/O/N:9');WOPENOUT:=ERSTAT(F)MOD 8192=0;END;
{:26}{27:}PROCEDURE ACLOSE(VAR F:ALPHAFILE);BEGIN CLOSE(F);END;
PROCEDURE BCLOSE(VAR F:BYTEFILE);BEGIN CLOSE(F);END;
PROCEDURE WCLOSE(VAR F:WORDFILE);BEGIN CLOSE(F);END;{:27}{30:}
FUNCTION INPUTLN(VAR F:ALPHAFILE;BYPASSEOLN:BOOLEAN):BOOLEAN;LABEL 1,30;
VAR N:INTEGER;K,M:0..BUFSIZE;
BEGIN IF BYPASSEOLN THEN BEGIN IF NOT EOF(F)THEN GET(F);
IF NOT EOF(F)THEN IF F↑=CHR(10)THEN GET(F);END;LAST:=FIRST;
IF EOF(F)THEN INPUTLN:=FALSE ELSE BEGIN READ(F,AUXBUF:N);
IF BUFFER[FIRST]=12 THEN BEGIN PAGE:=PAGE+1;LINE:=1;END;
1:IF LAST+N>MAXBUFSTACK THEN IF LAST+N>=BUFSIZE THEN BEGIN MAXBUFSTACK:=
BUFSIZE;OVERFLOW(128,BUFSIZE);END ELSE MAXBUFSTACK:=LAST+N;
IF N>0 THEN BEGIN M:=LAST;IF N=72 THEN LAST:=M+71 ELSE LAST:=M+N;
FOR K:=M TO LAST-1 DO BUFFER[K]:=XORD[AUXBUF[K-M]];
IF N=72 THEN BEGIN READ(F,AUXBUF:N);GOTO 1;END;
END ELSE IF F↑=CHR(12)THEN BEGIN AUXBUF[0]:=F↑;N:=1;GOTO 1;END;
WHILE TRUE DO BEGIN IF LAST=FIRST THEN GOTO 30;
IF BUFFER[LAST-1]<>32 THEN GOTO 30;LAST:=LAST-1;END;30:INPUTLN:=TRUE;
END;END;{:30}{36:}PROCEDURE ESCI(VAR X:INTEGER);EXTERN;
FUNCTION RESCAN:BOOLEAN;EXTERN;FUNCTION TMPIN(F:STRING;
VAR S:STRING):INTEGER;EXTERN;FUNCTION CCLSW:BOOLEAN;EXTERN;
PROCEDURE PTWR1W(PTY,C:INTEGER);EXTERN;FUNCTION INITTERMINAL:BOOLEAN;
LABEL 10;VAR L:INTEGER;LINEFOUND:BOOLEAN;
TMPCORBUF:PACKED ARRAY[0..100]OF CHAR;BEGIN;ESCI(INTERRUPT);LAST:=FIRST;
IF CCLSW THEN BEGIN L:=TMPIN('MF',TMPCORBUF);CURINPUT.LOCFIELD:=1;
WHILE(CURINPUT.LOCFIELD<L)AND(TMPCORBUF[CURINPUT.LOCFIELD]<>'←')DO
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
WHILE CURINPUT.LOCFIELD<L DO BEGIN IF TMPCORBUF[CURINPUT.LOCFIELD]>' '
THEN BEGIN BUFFER[LAST]:=XORD[TMPCORBUF[CURINPUT.LOCFIELD]];
LAST:=LAST+1;END;CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;END;
END ELSE IF FALSE THEN IF RESCAN THEN BEGIN READLN(TTY);
WHILE(NOT EOLN(TTY))AND(TTY↑<>';')DO GET(TTY);
IF TTY↑=';'THEN BEGIN GET(TTY);
WHILE NOT EOLN(TTY)DO BEGIN BUFFER[LAST]:=XORD[TTY↑];LAST:=LAST+1;
GET(TTY);END;END;END;LINEFOUND:=(LAST>FIRST);
WHILE TRUE DO BEGIN CURINPUT.LOCFIELD:=FIRST;
WHILE(CURINPUT.LOCFIELD<LAST)AND(BUFFER[CURINPUT.LOCFIELD]=32)DO
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
IF CURINPUT.LOCFIELD<LAST THEN BEGIN INITTERMINAL:=TRUE;GOTO 10;END;
IF LINEFOUND THEN WRITELN(TTY,'Please type the name of your input file.'
);WAKEUPTERMIN;WRITE(TTY,'**');BREAK(TTY);BUFFER[FIRST]:=0;
IF NOT INPUTLN(TTY,TRUE)THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! End of file on the terminal... why?');INITTERMINAL:=FALSE;
GOTO 10;END;LINEFOUND:=TRUE;END;10:END;{:36}{44:}
FUNCTION MAKESTRING:STRNUMBER;
BEGIN IF STRPTR=MAXSTRINGS THEN OVERFLOW(130,MAXSTRINGS-INITSTRPTR);
STRREF[STRPTR]:=1;STRPTR:=STRPTR+1;STRSTART[STRPTR]:=POOLPTR;
MAKESTRING:=STRPTR-1;END;{:44}{45:}FUNCTION STREQBUF(S:STRNUMBER;
K:INTEGER):BOOLEAN;LABEL 45;VAR J:POOLPOINTER;RESULT:BOOLEAN;
BEGIN J:=STRSTART[S];
WHILE J<STRSTART[S+1]DO BEGIN IF STRPOOL[J]<>BUFFER[K]THEN BEGIN RESULT
:=FALSE;GOTO 45;END;J:=J+1;K:=K+1;END;RESULT:=TRUE;45:STREQBUF:=RESULT;
END;{:45}{46:}FUNCTION STRVSSTR(S,T:STRNUMBER):INTEGER;LABEL 10;
VAR J,K:POOLPOINTER;LS,LT:INTEGER;L:INTEGER;
BEGIN LS:=(STRSTART[S+1]-STRSTART[S]);LT:=(STRSTART[T+1]-STRSTART[T]);
IF LS<=LT THEN L:=LS ELSE L:=LT;J:=STRSTART[S];K:=STRSTART[T];
WHILE L>0 DO BEGIN IF STRPOOL[J]<>STRPOOL[K]THEN BEGIN STRVSSTR:=STRPOOL
[J]-STRPOOL[K];GOTO 10;END;J:=J+1;K:=K+1;L:=L-1;END;STRVSSTR:=LS-LT;
10:END;{:46}{47:}FUNCTION GETSTRINGSST:BOOLEAN;LABEL 30,10;
VAR K,L:0..127;M,N:CHAR;G:STRNUMBER;A:INTEGER;C:BOOLEAN;
BEGIN POOLPTR:=0;STRPTR:=0;STRSTART[0]:=0;{48:}
FOR K:=0 TO 127 DO BEGIN IF({49:}(K<32)OR(K>126){:49}
)THEN BEGIN BEGIN STRPOOL[POOLPTR]:=94;POOLPTR:=POOLPTR+1;END;
BEGIN STRPOOL[POOLPTR]:=94;POOLPTR:=POOLPTR+1;END;
IF K<64 THEN BEGIN STRPOOL[POOLPTR]:=K+64;POOLPTR:=POOLPTR+1;
END ELSE BEGIN STRPOOL[POOLPTR]:=K-64;POOLPTR:=POOLPTR+1;END;
END ELSE BEGIN STRPOOL[POOLPTR]:=K;POOLPTR:=POOLPTR+1;END;G:=MAKESTRING;
STRREF[G]:=127;END{:48};{51:}NAMEOFFILE:=POOLNAME;
IF AOPENIN(POOLFILE)THEN BEGIN C:=FALSE;REPEAT{52:}
BEGIN IF EOF(POOLFILE)THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! MF.POOL has no check sum.');ACLOSE(POOLFILE);
GETSTRINGSST:=FALSE;GOTO 10;END;READ(POOLFILE,M,N);IF M='*'THEN{53:}
BEGIN A:=0;K:=1;
WHILE TRUE DO BEGIN IF(XORD[N]<48)OR(XORD[N]>57)THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! MF.POOL check sum doesn''t have nine digits.');
ACLOSE(POOLFILE);GETSTRINGSST:=FALSE;GOTO 10;END;A:=10*A+XORD[N]-48;
IF K=9 THEN GOTO 30;K:=K+1;READ(POOLFILE,N);END;
30:IF A<>509781824 THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! MF.POOL doesn''t match; TANGLE me again.');
ACLOSE(POOLFILE);GETSTRINGSST:=FALSE;GOTO 10;END;C:=TRUE;END{:53}
ELSE BEGIN IF(XORD[M]<48)OR(XORD[M]>57)OR(XORD[N]<48)OR(XORD[N]>57)THEN
BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! MF.POOL line doesn''t begin with two digits.');
ACLOSE(POOLFILE);GETSTRINGSST:=FALSE;GOTO 10;END;
L:=XORD[M]*10+XORD[N]-48*11;
IF POOLPTR+L+STRINGVACANC>POOLSIZE THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! You have to increase POOLSIZE.');ACLOSE(POOLFILE);
GETSTRINGSST:=FALSE;GOTO 10;END;
FOR K:=1 TO L DO BEGIN IF EOLN(POOLFILE)THEN M:=' 'ELSE READ(POOLFILE,M)
;BEGIN STRPOOL[POOLPTR]:=XORD[M];POOLPTR:=POOLPTR+1;END;END;
READLN(POOLFILE);G:=MAKESTRING;STRREF[G]:=127;END;END{:52};UNTIL C;
ACLOSE(POOLFILE);GETSTRINGSST:=TRUE;END ELSE BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! I can''t read MF.POOL.');ACLOSE(POOLFILE);
GETSTRINGSST:=FALSE;GOTO 10;END{:51};10:END;{:47}{64:}
PROCEDURE PRINTDD(N:INTEGER);BEGIN N:=ABS(N)MOD 100;
PRINTCHAR(48+(N DIV 10));PRINTCHAR(48+(N MOD 10));END;{:64}{65:}
PROCEDURE TERMINPUT;VAR K:0..BUFSIZE;BEGIN BREAK(TTY);BUFFER[FIRST]:=0;
IF NOT INPUTLN(TTY,TRUE)THEN FATALERROR(132);TERMOFFSET:=0;
SELECTOR:=SELECTOR-1;
IF LAST<>FIRST THEN FOR K:=FIRST TO LAST-1 DO PRINT(BUFFER[K]);PRINTLN;
BUFFER[LAST]:=37;SELECTOR:=SELECTOR+1;END;{:65}{85:}
PROCEDURE NORMALIZESEL;
BEGIN IF JOBNAME>0 THEN SELECTOR:=3 ELSE SELECTOR:=1;
IF INTERACTION=0 THEN SELECTOR:=SELECTOR-1;
IF JOBNAME=0 THEN OPENLOGFILE;END;{:85}{91:}PROCEDURE PAUSEFORINST;
BEGIN IF OKTOINTERRUP THEN BEGIN INTERACTION:=3;
IF(SELECTOR=2)OR(SELECTOR=0)THEN SELECTOR:=SELECTOR+1;
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(166);END;
BEGIN HELPPTR:=3;HELPLINE[2]:=167;HELPLINE[1]:=168;HELPLINE[0]:=169;END;
DELETIONSALL:=FALSE;ERROR;DELETIONSALL:=TRUE;INTERRUPT:=0;END;END;{:91}
{92:}PROCEDURE MISSINGERR(S:STRNUMBER);
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(170);
END;PRINT(S);PRINT(171);END;{:92}{97:}PROCEDURE CLEARARITH;
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(172);
END;BEGIN HELPPTR:=4;HELPLINE[3]:=173;HELPLINE[2]:=174;HELPLINE[1]:=175;
HELPLINE[0]:=176;END;ERROR;ARITHERROR:=FALSE;END;{:97}{99:}
FUNCTION ROUNDDECIMAL(K:SMALLNUMBER):SCALED;VAR A:INTEGER;BEGIN A:=0;
WHILE K>0 DO BEGIN K:=K-1;A:=(A+DIG[K]*131072)DIV 10;END;
ROUNDDECIMAL:=(A+1)DIV 2;END;{:99}{104:}
FUNCTION MAKEFRACTION(P,Q:INTEGER):FRACTION;VAR F:INTEGER;N:INTEGER;
NEGATIVE:BOOLEAN;BECAREFUL:INTEGER;
BEGIN IF P>=0 THEN NEGATIVE:=FALSE ELSE BEGIN P:=-P;NEGATIVE:=TRUE;END;
IF Q<=0 THEN BEGIN IF Q=0 THEN CONFUSION(47);Q:=-Q;
NEGATIVE:=NOT NEGATIVE;END;N:=P DIV Q;P:=P MOD Q;
IF N<8 THEN N:=(N-1)*268435456 ELSE BEGIN ARITHERROR:=TRUE;
N:=1610612736;END;{105:}F:=1;REPEAT BECAREFUL:=P-Q;P:=BECAREFUL+P;
IF P>=0 THEN F:=F+F+1 ELSE BEGIN F:=F+F;P:=P+Q;END;UNTIL F>=268435456;
BECAREFUL:=P-Q;IF BECAREFUL+P>=0 THEN F:=F+1{:105};
IF NEGATIVE THEN MAKEFRACTION:=-(F+N)ELSE MAKEFRACTION:=F+N;END;{:104}
{106:}FUNCTION TAKEFRACTION(Q:INTEGER;F:FRACTION):INTEGER;VAR P:INTEGER;
NEGATIVE:BOOLEAN;N:INTEGER;BECAREFUL:INTEGER;BEGIN{107:}
IF F>=0 THEN NEGATIVE:=FALSE ELSE BEGIN F:=-F;NEGATIVE:=TRUE;END;
IF Q<0 THEN BEGIN Q:=-Q;NEGATIVE:=NOT NEGATIVE;END;{:107};
IF F<268435456 THEN N:=0 ELSE BEGIN N:=F DIV 268435456;
F:=F MOD 268435456;
IF Q<=2147483647 DIV N THEN N:=N*Q ELSE BEGIN ARITHERROR:=TRUE;
N:=2147483647;END;END;F:=F+268435456;{108:}P:=134217728;
IF Q<1073741824 THEN REPEAT IF ODD(F)THEN P:=(P+Q)DIV 2 ELSE P:=(P)DIV 2
;F:=(F)DIV 2;
UNTIL F=1 ELSE REPEAT IF ODD(F)THEN P:=P+(Q-P)DIV 2 ELSE P:=(P)DIV 2;
F:=(F)DIV 2;UNTIL F=1{:108};BECAREFUL:=N-2147483647;
IF BECAREFUL+P>0 THEN BEGIN ARITHERROR:=TRUE;N:=2147483647-P;END;
IF NEGATIVE THEN TAKEFRACTION:=-(N+P)ELSE TAKEFRACTION:=N+P;END;{:106}
{109:}FUNCTION TAKESCALED(Q:INTEGER;F:SCALED):INTEGER;VAR P:INTEGER;
NEGATIVE:BOOLEAN;N:INTEGER;BECAREFUL:INTEGER;BEGIN{107:}
IF F>=0 THEN NEGATIVE:=FALSE ELSE BEGIN F:=-F;NEGATIVE:=TRUE;END;
IF Q<0 THEN BEGIN Q:=-Q;NEGATIVE:=NOT NEGATIVE;END;{:107};
IF F<65536 THEN N:=0 ELSE BEGIN N:=F DIV 65536;F:=F MOD 65536;
IF Q<=2147483647 DIV N THEN N:=N*Q ELSE BEGIN ARITHERROR:=TRUE;
N:=2147483647;END;END;F:=F+65536;{110:}P:=32768;
IF Q<1073741824 THEN REPEAT IF ODD(F)THEN P:=(P+Q)DIV 2 ELSE P:=(P)DIV 2
;F:=(F)DIV 2;
UNTIL F=1 ELSE REPEAT IF ODD(F)THEN P:=P+(Q-P)DIV 2 ELSE P:=(P)DIV 2;
F:=(F)DIV 2;UNTIL F=1{:110};BECAREFUL:=N-2147483647;
IF BECAREFUL+P>0 THEN BEGIN ARITHERROR:=TRUE;N:=2147483647-P;END;
IF NEGATIVE THEN TAKESCALED:=-(N+P)ELSE TAKESCALED:=N+P;END;{:109}{111:}
FUNCTION MAKESCALED(P,Q:INTEGER):SCALED;VAR F:INTEGER;N:INTEGER;
NEGATIVE:BOOLEAN;BECAREFUL:INTEGER;
BEGIN IF P>=0 THEN NEGATIVE:=FALSE ELSE BEGIN P:=-P;NEGATIVE:=TRUE;END;
IF Q<0 THEN BEGIN Q:=-Q;NEGATIVE:=NOT NEGATIVE;END;N:=P DIV Q;
P:=P MOD Q;IF N<32768 THEN N:=(N-1)*65536 ELSE BEGIN ARITHERROR:=TRUE;
N:=2147352576;END;{112:}F:=1;REPEAT BECAREFUL:=P-Q;P:=BECAREFUL+P;
IF P>=0 THEN F:=F+F+1 ELSE BEGIN F:=F+F;P:=P+Q;END;UNTIL F>=65536;
BECAREFUL:=P-Q;IF BECAREFUL+P>=0 THEN F:=F+1{:112};
IF NEGATIVE THEN MAKESCALED:=-(F+N)ELSE MAKESCALED:=F+N;END;{:111}{113:}
FUNCTION VELOCITY(ST,CT,SF,CF:FRACTION;T:SCALED):FRACTION;
VAR ACC,NUM,DENOM:INTEGER;
BEGIN ACC:=TAKEFRACTION(ST-(SF DIV 16),SF-(ST DIV 16));
ACC:=TAKEFRACTION(ACC,CT-CF);NUM:=536870912+TAKEFRACTION(ACC,379625062);
DENOM:=805306368+TAKEFRACTION(CT,497706707)+TAKEFRACTION(CF,307599661);
IF T<>65536 THEN NUM:=MAKESCALED(NUM,T);
IF NUM DIV 4>=DENOM THEN VELOCITY:=1073741824 ELSE VELOCITY:=
MAKEFRACTION(NUM,DENOM);END;{:113}{114:}
FUNCTION ABVSCD(A,B,C,D:INTEGER):INTEGER;LABEL 10;VAR Q,R:INTEGER;
BEGIN{115:}IF A<0 THEN BEGIN A:=-A;B:=-B;END;IF C<0 THEN BEGIN C:=-C;
D:=-D;END;
IF D<=0 THEN BEGIN IF B>=0 THEN IF((A=0)OR(B=0))AND((C=0)OR(D=0))THEN
BEGIN ABVSCD:=0;GOTO 10;END ELSE BEGIN ABVSCD:=1;GOTO 10;END;
IF D=0 THEN IF A=0 THEN BEGIN ABVSCD:=0;GOTO 10;
END ELSE BEGIN ABVSCD:=-1;GOTO 10;END;Q:=A;A:=C;C:=Q;Q:=-B;B:=-D;D:=Q;
END ELSE IF B<=0 THEN BEGIN IF B<0 THEN IF A>0 THEN BEGIN ABVSCD:=-1;
GOTO 10;END;IF C=0 THEN BEGIN ABVSCD:=0;GOTO 10;
END ELSE BEGIN ABVSCD:=-1;GOTO 10;END;END{:115};
WHILE TRUE DO BEGIN Q:=A DIV D;R:=C DIV B;
IF Q<>R THEN IF Q>R THEN BEGIN ABVSCD:=1;GOTO 10;
END ELSE BEGIN ABVSCD:=-1;GOTO 10;END;Q:=A MOD D;R:=C MOD B;
IF R=0 THEN IF Q=0 THEN BEGIN ABVSCD:=0;GOTO 10;
END ELSE BEGIN ABVSCD:=1;GOTO 10;END;IF Q=0 THEN BEGIN ABVSCD:=-1;
GOTO 10;END;A:=B;B:=Q;C:=D;D:=R;END;10:END;{:114}{116:}
FUNCTION ROUNDSCALED(X:SCALED):SCALED;
BEGIN IF X>=0 THEN ROUNDSCALED:=65536*((X+32768)DIV 65536)ELSE
ROUNDSCALED:=-65536*((-X+32767)DIV 65536);END;
FUNCTION ROUNDUNSCALE(X:SCALED):INTEGER;
BEGIN IF X>=0 THEN ROUNDUNSCALE:=(X+32768)DIV 65536 ELSE ROUNDUNSCALE:=-
((-X+32767)DIV 65536);END;FUNCTION FLOORSCALED(X:SCALED):SCALED;
BEGIN IF X>=0 THEN FLOORSCALED:=65536*(X DIV 65536)ELSE FLOORSCALED:=
-65536*((-X+65535)DIV 65536);END;
FUNCTION FLOORUNSCALE(X:SCALED):INTEGER;
BEGIN IF X>=0 THEN FLOORUNSCALE:=X DIV 65536 ELSE FLOORUNSCALE:=-((-X
+65535)DIV 65536);END;FUNCTION ROUNDFRACTIO(X:FRACTION):SCALED;
BEGIN IF X>=0 THEN ROUNDFRACTIO:=(X+2048)DIV 4096 ELSE ROUNDFRACTIO:=-((
-X+2047)DIV 4096);END;{:116}{118:}FUNCTION SQUARERT(X:SCALED):SCALED;
VAR K:SMALLNUMBER;Y,Q:INTEGER;BEGIN IF X<=0 THEN{119:}
BEGIN IF X<0 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(177);END;PRINTSCALED(X);PRINT(178);BEGIN HELPPTR:=2;
HELPLINE[1]:=179;HELPLINE[0]:=180;END;ERROR;END;SQUARERT:=0;END{:119}
ELSE BEGIN K:=23;Q:=2;WHILE X<536870912 DO BEGIN K:=K-1;X:=X+X+X+X;END;
IF X<1073741824 THEN Y:=0 ELSE BEGIN X:=X-1073741824;Y:=1;END;
REPEAT{120:}X:=X+X;Y:=Y+Y;IF X>=1073741824 THEN BEGIN X:=X-1073741824;
Y:=Y+1;END;X:=X+X;Y:=Y+Y-Q;Q:=Q+Q;
IF X>=1073741824 THEN BEGIN X:=X-1073741824;Y:=Y+1;END;
IF Y>Q THEN BEGIN Y:=Y-Q;Q:=Q+2;END ELSE IF Y<=0 THEN BEGIN Q:=Q-2;
Y:=Y+Q;END;K:=K-1{:120};UNTIL K=0;SQUARERT:=(Q)DIV 2;END;END;{:118}
{121:}FUNCTION PYTHADD(A,B:INTEGER):INTEGER;LABEL 30;VAR R:FRACTION;
BIG:BOOLEAN;BEGIN A:=ABS(A);B:=ABS(B);IF A<B THEN BEGIN R:=B;B:=A;A:=R;
END;
IF A>0 THEN BEGIN IF A<536870912 THEN BIG:=FALSE ELSE BEGIN A:=(A+2)DIV
4;B:=(B+2)DIV 4;BIG:=TRUE;END;{122:}
WHILE TRUE DO BEGIN R:=MAKEFRACTION(B,A);R:=TAKEFRACTION(R,R);
IF R=0 THEN GOTO 30;R:=MAKEFRACTION(R,1073741824+R);
A:=A+TAKEFRACTION(A+A,R);B:=TAKEFRACTION(B,R);END;30:{:122};
IF BIG THEN IF A<536870912 THEN A:=A+A+A+A ELSE BEGIN ARITHERROR:=TRUE;
A:=2147483647;END;END;PYTHADD:=A;END;{:121}{126:}
FUNCTION MLOG(X:SCALED):SCALED;VAR Y,Z:INTEGER;K:INTEGER;
BEGIN IF X<=0 THEN{128:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(181);END;PRINTSCALED(X);PRINT(178);BEGIN HELPPTR:=2;
HELPLINE[1]:=182;HELPLINE[0]:=180;END;ERROR;MLOG:=0;END{:128}
ELSE BEGIN Y:=1302456860;Z:=6581195;WHILE X<1073741824 DO BEGIN X:=X+X;
Y:=Y-93032639;Z:=Z-48782;END;Y:=Y+(Z DIV 65536);K:=2;
WHILE X>1073741828 DO{127:}BEGIN Z:=((X-1)DIV TWOTOTHE[K])+1;
WHILE X<1073741824+Z DO BEGIN Z:=(Z+1)DIV 2;K:=K+1;END;Y:=Y+SPECLOG[K];
X:=X-Z;END{:127};MLOG:=Y DIV 8;END;END;{:126}{129:}
FUNCTION MEXP(X:SCALED):SCALED;VAR K:SMALLNUMBER;Y,Z:INTEGER;
BEGIN IF X>174436200 THEN BEGIN ARITHERROR:=TRUE;MEXP:=2147483647;
END ELSE IF X<-197694359 THEN MEXP:=0 ELSE BEGIN IF X<=0 THEN BEGIN Z:=
-8*X;Y:=1048576;
END ELSE BEGIN IF X<=127919879 THEN Z:=1023359037-8*X ELSE Z:=8*(
174436200-X);Y:=2147483647;END;{130:}K:=1;
WHILE Z>0 DO BEGIN WHILE Z>=SPECLOG[K]DO BEGIN Z:=Z-SPECLOG[K];
Y:=Y-1-((Y-TWOTOTHE[K-1])DIV TWOTOTHE[K]);END;K:=K+1;END{:130};
IF X<=127919879 THEN MEXP:=(Y+8)DIV 16 ELSE MEXP:=Y;END;END;{:129}{133:}
FUNCTION NARG(X,Y:INTEGER):ANGLE;VAR Z:ANGLE;T:INTEGER;K:SMALLNUMBER;
OCTANT:1..8;BEGIN IF X>=0 THEN OCTANT:=1 ELSE BEGIN X:=-X;OCTANT:=2;END;
IF Y<0 THEN BEGIN Y:=-Y;OCTANT:=OCTANT+2;END;IF X<Y THEN BEGIN T:=Y;
Y:=X;X:=T;OCTANT:=OCTANT+4;END;IF X=0 THEN{134:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(183);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=184;HELPLINE[0]:=180;END;ERROR;
NARG:=0;END{:134}ELSE BEGIN{136:}
WHILE X>=536870912 DO BEGIN X:=(X)DIV 2;Y:=(Y)DIV 2;END;Z:=0;
IF Y>0 THEN BEGIN WHILE X<268435456 DO BEGIN X:=X+X;Y:=Y+Y;END;{137:}
K:=0;REPEAT Y:=Y+Y;K:=K+1;IF Y>X THEN BEGIN Z:=Z+SPECATAN[K];T:=X;
X:=X+(Y DIV TWOTOTHE[K+K]);Y:=Y-T;END;UNTIL K=15;REPEAT Y:=Y+Y;K:=K+1;
IF Y>X THEN BEGIN Z:=Z+SPECATAN[K];Y:=Y-X;END;UNTIL K=26{:137};END{:136}
;{135:}CASE OCTANT OF 1:NARG:=Z;5:NARG:=94371840-Z;6:NARG:=94371840+Z;
2:NARG:=188743680-Z;4:NARG:=Z-188743680;8:NARG:=-Z-94371840;
7:NARG:=Z-94371840;3:NARG:=-Z;END{:135};END;END;{:133}{139:}
PROCEDURE NSINCOS(Z:ANGLE);VAR K:SMALLNUMBER;Q:0..7;R:FRACTION;
X,Y,T:INTEGER;BEGIN WHILE Z<0 DO Z:=Z+377487360;Z:=Z MOD 377487360;
Q:=Z DIV 47185920;Z:=Z MOD 47185920;X:=268435456;Y:=X;
IF NOT ODD(Q)THEN Z:=47185920-Z;{141:}K:=1;
WHILE Z>0 DO BEGIN IF Z>=SPECATAN[K]THEN BEGIN Z:=Z-SPECATAN[K];T:=X;
X:=T+Y DIV TWOTOTHE[K];Y:=Y-T DIV TWOTOTHE[K];END;K:=K+1;END;
IF Y<0 THEN Y:=0{:141};{140:}CASE Q OF 0:;1:BEGIN T:=X;X:=Y;Y:=T;END;
2:BEGIN T:=X;X:=-Y;Y:=T;END;3:X:=-X;4:BEGIN X:=-X;Y:=-Y;END;
5:BEGIN T:=X;X:=-Y;Y:=-T;END;6:BEGIN T:=X;X:=Y;Y:=-T;END;7:Y:=-Y;
END{:140};R:=PYTHADD(X,Y);NCOS:=MAKEFRACTION(X,R);
NSIN:=MAKEFRACTION(Y,R);END;{:139}{143:}PROCEDURE NEWRANDOMS;
VAR K:0..54;X:FRACTION;
BEGIN FOR K:=0 TO 23 DO BEGIN X:=RANDOMS[K]-RANDOMS[K+31];
IF X<0 THEN X:=X+268435456;RANDOMS[K]:=X;END;
FOR K:=24 TO 54 DO BEGIN X:=RANDOMS[K]-RANDOMS[K-24];
IF X<0 THEN X:=X+268435456;RANDOMS[K]:=X;END;JRANDOM:=54;END;{:143}
{144:}PROCEDURE INITRANDOMS(SEED:SCALED);VAR J,JJ,K:FRACTION;I:0..54;
BEGIN J:=ABS(SEED);WHILE J>=268435456 DO J:=(J)DIV 2;K:=1;
FOR I:=0 TO 54 DO BEGIN JJ:=K;K:=J-K;J:=JJ;IF K<0 THEN K:=K+268435456;
RANDOMS[(I*21)MOD 55]:=J;END;NEWRANDOMS;NEWRANDOMS;NEWRANDOMS;END;{:144}
{145:}FUNCTION UNIFRAND(X:SCALED):SCALED;VAR Y:SCALED;
BEGIN IF X<=0 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(185);END;PRINTSCALED(X);PRINT(178);BEGIN HELPPTR:=2;
HELPLINE[1]:=186;HELPLINE[0]:=180;END;ERROR;UNIFRAND:=0;
END ELSE BEGIN IF JRANDOM=0 THEN NEWRANDOMS ELSE JRANDOM:=JRANDOM-1;
Y:=TAKEFRACTION(X,RANDOMS[JRANDOM]);
IF Y=X THEN UNIFRAND:=0 ELSE UNIFRAND:=Y;END;END;{:145}{146:}
FUNCTION NORMRAND:SCALED;VAR X,U,L:INTEGER;
BEGIN REPEAT REPEAT IF JRANDOM=0 THEN NEWRANDOMS ELSE JRANDOM:=JRANDOM-1
;X:=TAKEFRACTION(112429,RANDOMS[JRANDOM]-134217728);
IF JRANDOM=0 THEN NEWRANDOMS ELSE JRANDOM:=JRANDOM-1;
U:=RANDOMS[JRANDOM];UNTIL ABS(X)<U;X:=MAKEFRACTION(X,U);
L:=139548960-MLOG(U);UNTIL ABVSCD(1024,L,X,X)>=0;NORMRAND:=X;END;{:146}
{151:}PROCEDURE PRINTWORD(W:MEMORYWORD);BEGIN PRINTINT(W.INT);
PRINTCHAR(32);PRINTSCALED(W.INT);PRINTCHAR(32);
PRINTSCALED(W.INT DIV 4096);PRINTLN;PRINTINT(W.HH.LH);PRINTCHAR(61);
PRINTINT(W.HH.B0);PRINTCHAR(58);PRINTINT(W.HH.B1);PRINTCHAR(59);
PRINTINT(W.HH.RH);PRINTCHAR(32);PRINTINT(W.QQQQ.B0);PRINTCHAR(58);
PRINTINT(W.QQQQ.B1);PRINTCHAR(58);PRINTINT(W.QQQQ.B2);PRINTCHAR(58);
PRINTINT(W.QQQQ.B3);END;{:151}{156:}{211:}
PROCEDURE SHOWTOKENLIS(P,Q:INTEGER;L:INTEGER);LABEL 10;
VAR CLASS,C:SMALLNUMBER;R,V:INTEGER;BEGIN CLASS:=3;TALLY:=0;
WHILE(P<>0)AND(TALLY<L)DO BEGIN IF P=Q THEN{595:}
BEGIN FIRSTCOUNT:=TALLY;TRICKCOUNT:=TALLY+1+ERRORLINE-HALFERRORLIN;
IF TRICKCOUNT<ERRORLINE THEN TRICKCOUNT:=ERRORLINE;END{:595};{212:}C:=9;
IF(P<28)OR(P>MEMEND)THEN BEGIN PRINT(349);GOTO 10;END;
IF P<2500 THEN{213:}IF MEM[P].HH.LH=41 THEN{214:}
BEGIN IF CLASS=0 THEN PRINTCHAR(32);V:=MEM[P+1].INT;
IF V<0 THEN BEGIN IF CLASS=17 THEN PRINTCHAR(32);PRINTCHAR(91);
PRINTSCALED(V);PRINTCHAR(93);C:=18;END ELSE BEGIN PRINTSCALED(V);C:=0;
END;END{:214}
ELSE IF MEM[P].HH.LH<>40 THEN PRINT(352)ELSE BEGIN PRINTCHAR(34);
PRINT(MEM[P+1].INT);PRINTCHAR(34);C:=4;END{:213}
ELSE BEGIN R:=MEM[P].HH.LH;IF R>=2244 THEN{216:}
BEGIN IF R<2544 THEN BEGIN PRINT(354);R:=R-(2394);
END ELSE IF R<2694 THEN BEGIN PRINT(355);R:=R-(2544);
END ELSE BEGIN PRINT(356);R:=R-(2694);END;PRINTINT(R);PRINTCHAR(41);
C:=0;END{:216}ELSE IF R<1 THEN IF R=0 THEN{215:}
BEGIN IF CLASS=17 THEN PRINTCHAR(32);PRINT(353);C:=18;END{:215}
ELSE PRINT(350)ELSE BEGIN R:=HASH[R].RH;
IF(R<0)OR(R>=STRPTR)THEN PRINT(351)ELSE{217:}
BEGIN C:=CHARCLASS[STRPOOL[STRSTART[R]]];
IF C=CLASS THEN CASE C OF 9:PRINTCHAR(46);5,6,7,8:;
OTHERS:PRINTCHAR(32)END;PRINT(R);END{:217};END;END{:212};CLASS:=C;
P:=MEM[P].HH.RH;END;IF P<>0 THEN PRINT(348);10:END;{:211}{614:}
PROCEDURE RUNAWAY;BEGIN IF SCANNERSTATU>2 THEN BEGIN PRINTNL(483);
CASE SCANNERSTATU OF 3:PRINT(484);4,5:PRINT(485);6:PRINT(486);END;
PRINTLN;SHOWTOKENLIS(MEM[2501].HH.RH,0,ERRORLINE-10);END;END;{:614}
{:156}{157:}FUNCTION GETAVAIL:HALFWORD;VAR P:HALFWORD;BEGIN P:=AVAIL;
IF P<>0 THEN AVAIL:=MEM[AVAIL].HH.RH ELSE IF MEMEND<MEMMAX THEN BEGIN
MEMEND:=MEMEND+1;P:=MEMEND;END ELSE BEGIN RUNAWAY;
OVERFLOW(187,MEMMAX-2499);END;MEM[P].HH.RH:=0;DYNUSED:=DYNUSED+1;
GETAVAIL:=P;END;{:157}{161:}FUNCTION GETNODE(S:INTEGER):HALFWORD;
LABEL 40,10;VAR P:HALFWORD;Q:HALFWORD;R:INTEGER;T:HALFWORD;
BEGIN P:=ROVER;REPEAT{162:}Q:=P+MEM[P].HH.LH;
WHILE(MEM[Q].HH.RH=65535)DO{163:}BEGIN T:=MEM[Q+1].HH.RH;
IF Q=ROVER THEN ROVER:=T;MEM[T+1].HH.LH:=MEM[Q+1].HH.LH;
MEM[MEM[Q+1].HH.LH+1].HH.RH:=T;Q:=Q+MEM[Q].HH.LH;END{:163};R:=Q-S;
IF R>P+1 THEN{164:}BEGIN MEM[P].HH.LH:=R-P;ROVER:=P;GOTO 40;END{:164};
IF R=P THEN IF((MEM[P+1].HH.RH<>ROVER)OR(MEM[P+1].HH.LH<>ROVER))THEN{165
:}BEGIN ROVER:=MEM[P+1].HH.RH;T:=MEM[P+1].HH.LH;MEM[ROVER+1].HH.LH:=T;
MEM[T+1].HH.RH:=ROVER;GOTO 40;END{:165};MEM[P].HH.LH:=Q-P{:162};
P:=MEM[P+1].HH.RH;UNTIL P=ROVER;
IF S=1073741824 THEN BEGIN GETNODE:=65535;GOTO 10;END;
OVERFLOW(188,2500);40:MEM[R].HH.RH:=0;VARUSED:=VARUSED+S;
IF VARUSED>MAXVARUSED THEN MAXVARUSED:=VARUSED;GETNODE:=R;10:END;{:161}
{166:}PROCEDURE FREENODE(P:HALFWORD;S:HALFWORD);VAR Q:HALFWORD;
BEGIN IF{169:}(P<28)OR(P>=2500){:169}THEN CONFUSION(189);
MEM[P].HH.LH:=S;MEM[P].HH.RH:=65535;Q:=MEM[ROVER+1].HH.LH;
MEM[P+1].HH.LH:=Q;MEM[P+1].HH.RH:=ROVER;MEM[ROVER+1].HH.LH:=P;
MEM[Q+1].HH.RH:=P;VARUSED:=VARUSED-S;END;{:166}{167:}
PROCEDURE SORTAVAIL;VAR P,Q,R:HALFWORD;OLDROVER:HALFWORD;
BEGIN P:=GETNODE(1073741824);P:=MEM[ROVER+1].HH.RH;
MEM[ROVER+1].HH.RH:=65535;OLDROVER:=ROVER;WHILE P<>OLDROVER DO{168:}
IF P<ROVER THEN BEGIN Q:=P;P:=MEM[Q+1].HH.RH;MEM[Q+1].HH.RH:=ROVER;
ROVER:=Q;END ELSE BEGIN Q:=ROVER;
WHILE MEM[Q+1].HH.RH<P DO Q:=MEM[Q+1].HH.RH;R:=MEM[P+1].HH.RH;
MEM[P+1].HH.RH:=MEM[Q+1].HH.RH;MEM[Q+1].HH.RH:=P;P:=R;END{:168};
P:=ROVER;
WHILE MEM[P+1].HH.RH<>65535 DO BEGIN MEM[MEM[P+1].HH.RH+1].HH.LH:=P;
P:=MEM[P+1].HH.RH;END;MEM[P+1].HH.RH:=ROVER;MEM[ROVER+1].HH.LH:=P;END;
{:167}{172:}PROCEDURE FLUSHLIST(P:HALFWORD);VAR Q:HALFWORD;
BEGIN WHILE P>=2504 DO BEGIN Q:=MEM[P].HH.RH;BEGIN MEM[P].HH.RH:=AVAIL;
AVAIL:=P;DYNUSED:=DYNUSED-1;END;P:=Q;END;END;
PROCEDURE FLUSHNODELIS(P:HALFWORD);VAR Q:HALFWORD;
BEGIN WHILE P<>0 DO BEGIN Q:=P;P:=MEM[P].HH.RH;
IF Q<2500 THEN FREENODE(Q,2)ELSE BEGIN MEM[Q].HH.RH:=AVAIL;AVAIL:=Q;
DYNUSED:=DYNUSED-1;END;END;END;{:172}{175:}
PROCEDURE CHECKMEM(PRINTLOCS:BOOLEAN);LABEL 31,32;VAR P,Q:HALFWORD;
CLOBBERED:BOOLEAN;BEGIN FOR P:=0 TO MEMEND DO FREE[P]:=FALSE;{176:}
P:=AVAIL;Q:=0;CLOBBERED:=FALSE;
WHILE P<>0 DO BEGIN IF(P>MEMEND)OR(P<2504)THEN CLOBBERED:=TRUE ELSE IF
FREE[P]THEN CLOBBERED:=TRUE;IF CLOBBERED THEN BEGIN PRINTNL(190);
PRINTINT(Q);GOTO 31;END;FREE[P]:=TRUE;Q:=P;P:=MEM[Q].HH.RH;END;31:{:176}
;{177:}P:=ROVER;Q:=0;CLOBBERED:=FALSE;
REPEAT IF(P>=2500)OR(P<28)THEN CLOBBERED:=TRUE ELSE IF(MEM[P+1].HH.RH>=
2500)OR(MEM[P+1].HH.RH<28)THEN CLOBBERED:=TRUE ELSE IF NOT((MEM[P].HH.RH
=65535))OR(MEM[P].HH.LH<2)OR(P+MEM[P].HH.LH>2500)OR(MEM[MEM[P+1].HH.RH+1
].HH.LH<>P)THEN CLOBBERED:=TRUE;IF CLOBBERED THEN BEGIN PRINTNL(191);
PRINTINT(Q);GOTO 32;END;
FOR Q:=P TO P+MEM[P].HH.LH-1 DO BEGIN IF FREE[Q]THEN BEGIN PRINTNL(192);
PRINTINT(Q);GOTO 32;END;FREE[Q]:=TRUE;END;Q:=P;P:=MEM[P+1].HH.RH;
UNTIL P=ROVER;32:{:177};{178:}P:=0;
WHILE P<=2500 DO BEGIN IF(MEM[P].HH.RH=65535)THEN BEGIN PRINTNL(193);
PRINTINT(P);END;WHILE(P<=2500)AND NOT FREE[P]DO P:=P+1;
WHILE(P<=2500)AND FREE[P]DO P:=P+1;END{:178};IF PRINTLOCS THEN{179:}
BEGIN PRINTNL(194);
FOR P:=0 TO MEMEND DO IF NOT FREE[P]AND((P>WASMEMEND)OR WASFREE[P])THEN
BEGIN PRINTCHAR(32);PRINTINT(P);END;END{:179};
FOR P:=0 TO MEMEND DO WASFREE[P]:=FREE[P];WASMEMEND:=MEMEND;END;{:175}
{180:}PROCEDURE SEARCHMEM(P:HALFWORD);VAR Q:INTEGER;
BEGIN FOR Q:=0 TO MEMEND DO BEGIN IF MEM[Q].HH.RH=P THEN BEGIN PRINTNL(
195);PRINTINT(Q);PRINTCHAR(41);END;
IF MEM[Q].HH.LH=P THEN BEGIN PRINTNL(196);PRINTINT(Q);PRINTCHAR(41);END;
END;{203:}
FOR Q:=1 TO 2243 DO BEGIN IF EQTB[Q].RH=P THEN BEGIN PRINTNL(321);
PRINTINT(Q);PRINTCHAR(41);END;END{:203};END;{:180}{183:}
PROCEDURE PRINTOP(C:QUARTERWORD);
BEGIN IF C<=19 THEN PRINTTYPE(C)ELSE CASE C OF 30:PRINT(222);
31:PRINT(223);32:PRINT(224);33:PRINT(225);34:PRINT(226);35:PRINT(227);
36:PRINT(228);37:PRINT(229);38:PRINT(230);39:PRINT(212);40:PRINT(231);
41:PRINT(232);42:PRINT(233);43:PRINT(234);44:PRINT(235);45:PRINT(236);
46:PRINT(237);47:PRINT(238);48:PRINT(239);49:PRINT(240);50:PRINT(241);
51:PRINT(242);52:PRINT(243);53:PRINT(244);54:PRINT(245);55:PRINT(246);
56:PRINT(247);57:PRINT(248);58:PRINT(249);59:PRINT(250);60:PRINT(251);
61:PRINT(252);62:PRINT(253);63:PRINT(254);64:PRINT(255);
65:PRINTCHAR(43);66:PRINTCHAR(45);67:PRINTCHAR(42);68:PRINTCHAR(47);
69:PRINT(256);71:PRINT(257);70:PRINT(258);72:PRINTCHAR(60);
73:PRINT(259);74:PRINTCHAR(62);75:PRINT(260);76:PRINTCHAR(61);
77:PRINT(261);90:PRINT(262);91:PRINT(263);92:PRINT(264);93:PRINT(265);
94:PRINT(266);95:PRINT(267);96:PRINT(268);78:PRINT(38);79:PRINT(269);
80:PRINT(270);81:PRINT(271);82:PRINT(272);83:PRINT(273);84:PRINT(274);
85:PRINT(275);86:PRINT(276);87:PRINT(277);88:PRINT(278);
OTHERS:PRINT(279)END;END;{:183}{188:}PROCEDURE FIXDATEANDTI;
VAR T:INTEGER;DATE:INTEGER;G:BOOLEAN;BEGIN CALLI(131137,,T,T,G);
DATE:=T DIV 262144;INTERNAL[15]:=((T MOD 262144)DIV 60)*65536;
INTERNAL[14]:=((DATE MOD 31)+1)*65536;
INTERNAL[13]:=(((DATE DIV 31)MOD 12)+1)*65536;
INTERNAL[12]:=((DATE DIV(31*12))+1964)*65536;
IF INTERNAL[13]=262144 THEN IF INTERNAL[14]=65536 THEN WRITELN(TTY,
'Hello! I am your user-friendly MF System.');END;{:188}{199:}
FUNCTION IDLOOKUP(J,L:INTEGER):HALFWORD;LABEL 40;VAR H:INTEGER;
P:HALFWORD;K:HALFWORD;BEGIN IF L=1 THEN{200:}BEGIN P:=BUFFER[J]+1;
HASH[P].RH:=P-1;GOTO 40;END{:200};{202:}H:=BUFFER[J];
FOR K:=J+1 TO J+L-1 DO BEGIN H:=H+H+BUFFER[K];
WHILE H>=1777 DO H:=H-1777;END{:202};P:=H+129;
WHILE TRUE DO BEGIN IF HASH[P].RH>0 THEN IF(STRSTART[HASH[P].RH+1]-
STRSTART[HASH[P].RH])=L THEN IF STREQBUF(HASH[P].RH,J)THEN GOTO 40;
IF HASH[P].LH=0 THEN{201:}
BEGIN IF HASH[P].RH>0 THEN BEGIN REPEAT IF(HASHUSED=1)THEN OVERFLOW(320,
2100);HASHUSED:=HASHUSED-1;UNTIL HASH[HASHUSED].RH=0;
HASH[P].LH:=HASHUSED;P:=HASHUSED;END;
IF L=1 THEN HASH[P].RH:=BUFFER[J]ELSE BEGIN BEGIN IF POOLPTR+L>POOLSIZE
THEN OVERFLOW(129,POOLSIZE-INITPOOLPTR);END;
FOR K:=J TO J+L-1 DO BEGIN STRPOOL[POOLPTR]:=BUFFER[K];
POOLPTR:=POOLPTR+1;END;HASH[P].RH:=MAKESTRING;STRREF[HASH[P].RH]:=127;
END;STCOUNT:=STCOUNT+1;GOTO 40;END{:201};P:=HASH[P].LH;END;
40:IDLOOKUP:=P;END;{:199}{204:}PROCEDURE PRIMITIVE(S:STRNUMBER;
C:HALFWORD;O:HALFWORD);VAR K:POOLPOINTER;J:SMALLNUMBER;L:SMALLNUMBER;
BEGIN K:=STRSTART[S];L:=STRSTART[S+1]-K;
FOR J:=0 TO L-1 DO BUFFER[J]:=STRPOOL[K+J];CURSYM:=IDLOOKUP(0,L);
IF S>=128 THEN BEGIN FLUSHSTRING(STRPTR-1);HASH[CURSYM].RH:=S;END;
EQTB[CURSYM].LH:=C;EQTB[CURSYM].RH:=O;END;{:204}{209:}
FUNCTION NEWNUMTOK(V:SCALED):HALFWORD;VAR P:HALFWORD;
BEGIN P:=GETNODE(2);MEM[P+1].INT:=V;MEM[P].HH.LH:=41;NEWNUMTOK:=P;END;
{:209}{210:}PROCEDURE FLUSHTOKENLI(P:HALFWORD);VAR Q:HALFWORD;
BEGIN WHILE P<>0 DO BEGIN Q:=P;P:=MEM[P].HH.RH;
IF Q>=2504 THEN BEGIN MEM[Q].HH.RH:=AVAIL;AVAIL:=Q;DYNUSED:=DYNUSED-1;
END ELSE BEGIN IF MEM[Q].HH.LH=40 THEN BEGIN IF STRREF[MEM[Q+1].INT]<127
THEN IF STRREF[MEM[Q+1].INT]>1 THEN STRREF[MEM[Q+1].INT]:=STRREF[MEM[Q+1
].INT]-1 ELSE FLUSHSTRING(MEM[Q+1].INT);END;FREENODE(Q,2);END;END;END;
{:210}{218:}PROCEDURE DELETEMACREF(P:HALFWORD);
BEGIN IF MEM[P].HH.LH=0 THEN FLUSHTOKENLI(P)ELSE MEM[P].HH.LH:=MEM[P].HH
.LH-1;END;{:218}{219:}{575:}PROCEDURE PRINTCMDMOD(C,M:INTEGER);
BEGIN CASE C OF{206:}17:PRINT(323);76:PRINT(322);70:PRINT(324);
31:PRINT(315);72:PRINT(325);77:PRINT(58);78:PRINT(44);58:PRINT(326);
18:PRINT(327);60:PRINT(328);26:PRINT(329);9:PRINT(330);80:PRINT(316);
25:PRINT(331);6:PRINT(332);68:PRINT(333);11:PRINT(334);45:PRINT(123);
52:PRINT(91);12:PRINT(335);13:PRINT(336);67:PRINT(337);71:PRINT(338);
27:PRINT(339);47:PRINT(279);23:PRINT(340);15:PRINT(341);7:PRINTCHAR(92);
64:PRINT(125);63:PRINT(93);10:PRINT(342);79:PRINT(59);16:PRINT(343);
73:PRINT(344);34:PRINT(345);69:PRINT(346);74:PRINT(347);{:206}{632:}
14:IF M<=2 THEN IF M=1 THEN PRINT(497)ELSE IF M<1 THEN PRINT(317)ELSE
PRINT(498)ELSE IF M=53 THEN PRINT(499)ELSE IF M=43 THEN PRINT(500)ELSE
PRINT(501);
4:IF M<=1 THEN IF M=1 THEN PRINT(504)ELSE PRINT(318)ELSE IF M=2394 THEN
PRINT(502)ELSE PRINT(503);{:632}{639:}61:CASE M OF 1:PRINT(510);
2:PRINTCHAR(64);3:PRINT(511);OTHERS:PRINT(509)END;{:639}{646:}
57:IF M>=2394 THEN IF M=2394 THEN PRINT(521)ELSE IF M=2544 THEN PRINT(
522)ELSE PRINT(523)ELSE IF M<2 THEN PRINT(524)ELSE IF M=2 THEN PRINT(525
)ELSE PRINT(526);{:646}{661:}3:IF M=0 THEN PRINT(537)ELSE PRINT(462);
{:661}{688:}1:PRINT(566);2:CASE M OF 2:PRINT(314);4:PRINT(568);
OTHERS:PRINT(567)END;{:688}{824:}
59:IF M=0 THEN PRINT(673)ELSE PRINT(672);{:824}{836:}
32,33,36,55,44,49,35,42,54,46,50,51:PRINTOP(M);{:836}{948:}
29:PRINTTYPE(M);{:948}{953:}81:IF M=0 THEN PRINT(759)ELSE PRINT(760);
{:953}{958:}22:CASE M OF 0:PRINT(145);1:PRINT(146);2:PRINT(147);
OTHERS:PRINT(765)END;{:958}{961:}
20:IF M=0 THEN PRINT(766)ELSE PRINT(767);{:961}{971:}
21:CASE M OF 0:PRINT(780);1:PRINT(781);2:PRINT(782);3:PRINT(783);
4:PRINT(784);5:PRINT(785);OTHERS:PRINT(786)END;{:971}{976:}
30,62:BEGIN IF C=30 THEN PRINT(792)ELSE PRINT(793);PRINT(794);
PRINT(HASH[M].RH);END;39:IF M=0 THEN PRINT(795)ELSE PRINT(796);
8:PRINT(797);53,43,48:BEGIN PRINTCMDMOD(14,C);PRINT(798);PRINTLN;
SHOWTOKENLIS(MEM[MEM[M].HH.RH].HH.RH,0,1000);END;5:PRINT(799);
37:PRINT(INTNAME[M]);{:976}{985:}
66:IF M=0 THEN PRINT(806)ELSE IF M=1 THEN PRINT(807)ELSE PRINT(808);
65:IF M=6 THEN PRINT(809)ELSE PRINT(810);{:985}{1010:}
24:IF M<1 THEN PRINT(839)ELSE IF M=1 THEN PRINT(840)ELSE PRINT(841);
{:1010}{1032:}19:CASE M OF 0:PRINT(852);1:PRINT(853);2:PRINT(854);
3:PRINT(855);OTHERS:PRINT(856)END;{:1032}{1040:}
75:IF M=0 THEN PRINT(876)ELSE PRINT(877);{:1040}{1105:}
28:IF M=16 THEN PRINT(897)ELSE PRINT(896);{:1105}OTHERS:PRINT(448)END;
END;{:575}PROCEDURE SHOWMACRO(P:HALFWORD;Q,L:INTEGER);LABEL 10;
VAR R:HALFWORD;BEGIN P:=MEM[P].HH.RH;
WHILE MEM[P].HH.LH>5 DO BEGIN R:=MEM[P].HH.RH;MEM[P].HH.RH:=0;
SHOWTOKENLIS(P,0,L);MEM[P].HH.RH:=R;P:=R;
IF L>0 THEN L:=L-TALLY ELSE GOTO 10;END;TALLY:=0;
CASE MEM[P].HH.LH OF 0:PRINT(357);1,2,3:BEGIN PRINTCHAR(60);
PRINTCMDMOD(57,MEM[P].HH.LH);PRINT(358);END;4:PRINT(359);5:PRINT(360);
END;SHOWTOKENLIS(MEM[P].HH.RH,Q,L-TALLY);10:END;{:219}{224:}
PROCEDURE INITBIGNODE(P:HALFWORD);VAR Q:HALFWORD;S:SMALLNUMBER;
BEGIN S:=BIGNODESIZE[MEM[P].HH.B0];Q:=GETNODE(S);REPEAT S:=S-2;
MEM[Q+S].HH.B0:=20;MEM[Q+S+1].INT:=0;MEM[Q+S].HH.B1:=(S)DIV 2+5;
MEM[Q+S].HH.RH:=0;UNTIL S=0;MEM[Q].HH.RH:=P;MEM[P+1].INT:=Q;END;{:224}
{225:}FUNCTION IDTRANSFORM:HALFWORD;VAR P,Q,R:HALFWORD;
BEGIN P:=GETNODE(2);MEM[P].HH.B0:=14;MEM[P].HH.B1:=11;MEM[P+1].INT:=0;
INITBIGNODE(P);Q:=MEM[P+1].INT;R:=Q+12;REPEAT R:=R-2;MEM[R].HH.B0:=16;
MEM[R+1].INT:=0;UNTIL R=Q;MEM[Q+5].INT:=65536;MEM[Q+11].INT:=65536;
IDTRANSFORM:=P;END;{:225}{226:}PROCEDURE NEWROOT(X:HALFWORD);
VAR P:HALFWORD;BEGIN P:=GETNODE(2);MEM[P].HH.B0:=0;MEM[P].HH.B1:=0;
MEM[P].HH.RH:=X;EQTB[X].RH:=P;END;{:226}{227:}
PROCEDURE PRINTVARIABL(P:HALFWORD);LABEL 40,10;VAR Q:HALFWORD;
R:HALFWORD;BEGIN WHILE MEM[P].HH.B1>=5 DO{229:}
BEGIN CASE MEM[P].HH.B1 OF 5:PRINTCHAR(120);6:PRINTCHAR(121);
7:PRINT(363);8:PRINT(364);9:PRINT(365);10:PRINT(366);
11:BEGIN PRINT(367);PRINTINT(P-0);GOTO 10;END;END;PRINT(368);
P:=MEM[P-2*(MEM[P].HH.B1-5)].HH.RH;END{:229};Q:=0;
WHILE MEM[P].HH.B1>1 DO{228:}
BEGIN IF MEM[P].HH.B1=3 THEN BEGIN R:=NEWNUMTOK(MEM[P+2].INT);
REPEAT P:=MEM[P].HH.RH;UNTIL MEM[P].HH.B1=4;
END ELSE IF MEM[P].HH.B1=2 THEN BEGIN P:=MEM[P].HH.RH;GOTO 40;
END ELSE BEGIN IF MEM[P].HH.B1<>4 THEN CONFUSION(362);R:=GETAVAIL;
MEM[R].HH.LH:=MEM[P+2].HH.LH;END;MEM[R].HH.RH:=Q;Q:=R;
40:P:=MEM[P+2].HH.RH;END{:228};R:=GETAVAIL;MEM[R].HH.LH:=MEM[P].HH.RH;
MEM[R].HH.RH:=Q;IF MEM[P].HH.B1=1 THEN PRINT(361);
SHOWTOKENLIS(R,0,1000);FLUSHTOKENLI(R);10:END;{:227}{230:}
FUNCTION NEWSTRUCTURE(P:HALFWORD):HALFWORD;VAR Q,R:HALFWORD;
BEGIN CASE MEM[P].HH.B1 OF 0:BEGIN Q:=MEM[P].HH.RH;R:=GETNODE(2);
EQTB[Q].RH:=R;END;3:{231:}BEGIN Q:=P;REPEAT Q:=MEM[Q].HH.RH;
UNTIL MEM[Q].HH.B1=4;Q:=MEM[Q+2].HH.RH;R:=Q+1;REPEAT Q:=R;
R:=MEM[R].HH.RH;UNTIL R=P;R:=GETNODE(3);MEM[Q].HH.RH:=R;
MEM[R+2].INT:=MEM[P+2].INT;END{:231};4:{232:}BEGIN Q:=MEM[P+2].HH.RH;
R:=MEM[Q+1].HH.LH;REPEAT Q:=R;R:=MEM[R].HH.RH;UNTIL R=P;R:=GETNODE(3);
MEM[Q].HH.RH:=R;MEM[R+2]:=MEM[P+2];
IF MEM[P+2].HH.LH=0 THEN BEGIN Q:=MEM[P+2].HH.RH+1;
WHILE MEM[Q].HH.RH<>P DO Q:=MEM[Q].HH.RH;MEM[Q].HH.RH:=R;END;END{:232};
OTHERS:CONFUSION(369)END;MEM[R].HH.RH:=MEM[P].HH.RH;MEM[R].HH.B0:=22;
MEM[R].HH.B1:=MEM[P].HH.B1;MEM[R+1].HH.LH:=P;MEM[P].HH.B1:=2;
Q:=GETNODE(3);MEM[P].HH.RH:=Q;MEM[R+1].HH.RH:=Q;MEM[Q+2].HH.RH:=R;
MEM[Q].HH.B0:=0;MEM[Q].HH.B1:=4;MEM[Q].HH.RH:=22;MEM[Q+2].HH.LH:=0;
NEWSTRUCTURE:=R;END;{:230}{233:}
FUNCTION FINDVARIABLE(T:HALFWORD):HALFWORD;LABEL 10;
VAR P,Q,R,S:HALFWORD;PP,QQ,RR,SS:HALFWORD;N:INTEGER;SAVEWORD:MEMORYWORD;
BEGIN P:=MEM[T].HH.LH;T:=MEM[T].HH.RH;
IF EQTB[P].LH MOD 82<>39 THEN BEGIN FINDVARIABLE:=0;GOTO 10;END;
IF EQTB[P].RH=0 THEN NEWROOT(P);P:=EQTB[P].RH;PP:=P;
WHILE T<>0 DO BEGIN{234:}
IF MEM[PP].HH.B0<>22 THEN BEGIN IF MEM[PP].HH.B0>22 THEN BEGIN
FINDVARIABLE:=0;GOTO 10;END;SS:=NEWSTRUCTURE(PP);IF P=PP THEN P:=SS;
PP:=SS;END;IF MEM[P].HH.B0<>22 THEN P:=NEWSTRUCTURE(P){:234};
IF T<2500 THEN{235:}BEGIN N:=MEM[T+1].INT;
PP:=MEM[MEM[PP+1].HH.LH].HH.RH;Q:=MEM[MEM[P+1].HH.LH].HH.RH;
SAVEWORD:=MEM[Q+2];MEM[Q+2].INT:=2147483647;S:=P+1;REPEAT R:=S;
S:=MEM[S].HH.RH;UNTIL N<=MEM[S+2].INT;
IF N=MEM[S+2].INT THEN P:=S ELSE BEGIN P:=GETNODE(3);MEM[R].HH.RH:=P;
MEM[P].HH.RH:=S;MEM[P+2].INT:=N;MEM[P].HH.B1:=3;MEM[P].HH.B0:=0;END;
MEM[Q+2]:=SAVEWORD;END{:235}ELSE{236:}BEGIN N:=MEM[T].HH.LH;
SS:=MEM[PP+1].HH.LH;REPEAT RR:=SS;SS:=MEM[SS].HH.RH;
UNTIL N<=MEM[SS+2].HH.LH;IF N<MEM[SS+2].HH.LH THEN BEGIN QQ:=GETNODE(3);
MEM[RR].HH.RH:=QQ;MEM[QQ].HH.RH:=SS;MEM[QQ+2].HH.LH:=N;MEM[QQ].HH.B1:=4;
MEM[QQ].HH.B0:=0;MEM[QQ+2].HH.RH:=PP;SS:=QQ;END;
IF P=PP THEN BEGIN P:=SS;PP:=SS;END ELSE BEGIN PP:=SS;S:=MEM[P+1].HH.LH;
REPEAT R:=S;S:=MEM[S].HH.RH;UNTIL N<=MEM[S+2].HH.LH;
IF N=MEM[S+2].HH.LH THEN P:=S ELSE BEGIN Q:=GETNODE(3);MEM[R].HH.RH:=Q;
MEM[Q].HH.RH:=S;MEM[Q+2].HH.LH:=N;MEM[Q].HH.B1:=4;MEM[Q].HH.B0:=0;
MEM[Q+2].HH.RH:=P;P:=Q;END;END;END{:236};T:=MEM[T].HH.RH;END;
IF MEM[PP].HH.B0>=22 THEN IF MEM[PP].HH.B0=22 THEN PP:=MEM[PP+1].HH.LH
ELSE BEGIN FINDVARIABLE:=0;GOTO 10;END;
IF MEM[P].HH.B0=22 THEN P:=MEM[P+1].HH.LH;
IF MEM[P].HH.B0=0 THEN BEGIN IF MEM[PP].HH.B0=0 THEN BEGIN MEM[PP].HH.B0
:=19;MEM[PP+1].INT:=0;END;MEM[P].HH.B0:=MEM[PP].HH.B0;MEM[P+1].INT:=0;
END;FINDVARIABLE:=P;10:END;{:233}{237:}{261:}
PROCEDURE TOSSKNOTLIST(P:HALFWORD);VAR Q:HALFWORD;R:HALFWORD;BEGIN Q:=P;
REPEAT R:=MEM[Q].HH.RH;FREENODE(Q,7);Q:=R;UNTIL Q=P;END;{:261}{370:}
PROCEDURE TOSSEDGES(H:HALFWORD);VAR P,Q:HALFWORD;BEGIN Q:=MEM[H].HH.RH;
WHILE Q<>H DO BEGIN FLUSHLIST(MEM[Q+1].HH.RH);
IF MEM[Q+1].HH.LH>1 THEN FLUSHLIST(MEM[Q+1].HH.LH);P:=Q;Q:=MEM[Q].HH.RH;
FREENODE(P,2);END;FREENODE(H,6);END;{:370}{444:}
PROCEDURE TOSSPEN(P:HALFWORD);VAR K:1..8;W,WW:HALFWORD;
BEGIN IF P<>3 THEN BEGIN FOR K:=1 TO 8 DO BEGIN W:=MEM[P+K].HH.RH;
REPEAT WW:=MEM[W].HH.RH;FREENODE(W,3);W:=WW;UNTIL W=MEM[P+K].HH.RH;END;
FREENODE(P,10);END;END;{:444}{557:}PROCEDURE SHOWIMPLIEDE(P:HALFWORD);
LABEL 10;VAR T:SMALLNUMBER;BEGIN T:=MEM[P].HH.B1;
IF T>=5 THEN BEGIN IF T<11 THEN T:=MEM[MEM[P-2*(T-5)].HH.RH].HH.B1;
IF T=11 THEN GOTO 10;END;BEGINDIAGNOS;PRINTNL(437);PRINTVARIABL(P);
PRINTCHAR(61);PRINTSCALED(MEM[P+1].INT);ENDDIAGNOSTI(FALSE);10:END;
{:557}{568:}{262:}FUNCTION NULLPATH:HALFWORD;VAR P:HALFWORD;
BEGIN P:=GETNODE(7);MEM[P].HH.B0:=0;MEM[P].HH.B1:=0;MEM[P].HH.RH:=P;
MEM[P+1].INT:=0;MEM[P+2].INT:=0;MEM[P+3].INT:=0;MEM[P+5].INT:=0;
MEM[P+4].INT:=0;MEM[P+6].INT:=0;NULLPATH:=P;END;{:262}{320:}
PROCEDURE INITEDGES(H:HALFWORD);BEGIN MEM[H].HH.LH:=H;MEM[H].HH.RH:=H;
MEM[H+1].HH.LH:=8191;MEM[H+1].HH.RH:=1;MEM[H+2].HH.LH:=8191;
MEM[H+2].HH.RH:=1;MEM[H+3].HH.LH:=4096;MEM[H+3].HH.RH:=0;
MEM[H+4].INT:=0;MEM[H+5].HH.RH:=H;MEM[H+5].HH.LH:=0;END;
FUNCTION NEWEDGES:HALFWORD;VAR H:HALFWORD;BEGIN H:=GETNODE(6);
INITEDGES(H);NEWEDGES:=H;END;{:320}PROCEDURE RINGDELETE(P:HALFWORD);
LABEL 10;VAR Q,R:HALFWORD;BEGIN Q:=MEM[P+1].INT;
IF Q<>0 THEN IF Q<>P THEN BEGIN WHILE MEM[Q].HH.B1=11 DO Q:=MEM[Q+1].INT
;IF Q=P THEN BEGIN{573:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(442);END;PRINTVARIABL(P);PRINT(443);BEGIN HELPPTR:=4;
HELPLINE[3]:=444;HELPLINE[2]:=445;HELPLINE[1]:=446;HELPLINE[0]:=447;END;
ERROR;END{:573};{569:}R:=MEM[Q+1].INT;WHILE TRUE DO BEGIN Q:=R;
R:=MEM[Q+1].INT;IF Q=P THEN GOTO 10;MEM[Q].HH.B0:=MEM[Q].HH.B0-1;
CASE MEM[Q].HH.B0 OF 2:MEM[Q+1].INT:=31;4:MEM[Q+1].INT:=311;
6:MEM[Q+1].INT:=3;11:MEM[Q+1].INT:=NULLPATH;9:MEM[Q+1].INT:=NEWEDGES;
END;Q:=R;END{:569};END;WHILE MEM[Q+1].INT<>P DO Q:=MEM[Q+1].INT;
MEM[Q+1].INT:=MEM[P+1].INT;END;10:END;{:568}{754:}
PROCEDURE RECYCLEVALUE(P:HALFWORD);LABEL 30;VAR T:SMALLNUMBER;V:INTEGER;
Q,R,S:HALFWORD;NOTSCOLDEDYE:BOOLEAN;BEGIN T:=MEM[P].HH.B0;
IF T<17 THEN V:=MEM[P+1].INT;CASE T OF 0,1,2,16,19:;
3,5,7,10,12:RINGDELETE(P);
4:BEGIN IF STRREF[V]<127 THEN IF STRREF[V]>1 THEN STRREF[V]:=STRREF[V]-1
ELSE FLUSHSTRING(V);END;
6:IF MEM[V].HH.LH=0 THEN TOSSPEN(V)ELSE MEM[V].HH.LH:=MEM[V].HH.LH-1;
11,13,8:TOSSKNOTLIST(V);9:TOSSEDGES(V);15,14:{755:}
IF V<>0 THEN BEGIN Q:=V+BIGNODESIZE[T];REPEAT Q:=Q-2;RECYCLEVALUE(Q);
UNTIL Q=V;FREENODE(V,BIGNODESIZE[T]);END{:755};17,18:{756:}
BEGIN Q:=MEM[P+1].HH.RH;WHILE MEM[Q].HH.LH<>0 DO Q:=MEM[Q].HH.RH;
MEM[MEM[P+1].HH.LH].HH.RH:=MEM[Q].HH.RH;
MEM[MEM[Q].HH.RH+1].HH.LH:=MEM[P+1].HH.LH;MEM[Q].HH.RH:=0;
FLUSHNODELIS(MEM[P+1].HH.RH);END{:756};20:{757:}
BEGIN NOTSCOLDEDYE:=TRUE;Q:=MEM[13].HH.RH;WHILE Q<>13 DO BEGIN S:=Q+1;
WHILE TRUE DO BEGIN R:=MEM[S].HH.RH;IF MEM[R].HH.LH=0 THEN GOTO 30;
IF MEM[R].HH.LH=P THEN{758:}BEGIN IF NOTSCOLDEDYE THEN BEGIN{573:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(442);
END;PRINTVARIABL(P);PRINT(443);BEGIN HELPPTR:=4;HELPLINE[3]:=444;
HELPLINE[2]:=445;HELPLINE[1]:=446;HELPLINE[0]:=447;END;ERROR;END{:573};
NOTSCOLDEDYE:=FALSE;END;MEM[S].HH.RH:=MEM[R].HH.RH;FREENODE(R,2);
END{:758}ELSE S:=R;END;30:IF MEM[Q+1].HH.RH=R THEN{759:}
BEGIN S:=MEM[R].HH.RH;MEM[S+1].HH.LH:=MEM[Q+1].HH.LH;
MEM[MEM[Q+1].HH.LH].HH.RH:=S;MEM[Q].HH.B0:=16;
MEM[Q+1].INT:=MEM[R+1].INT;FREENODE(R,2);
IF INTERNAL[2]>0 THEN SHOWIMPLIEDE(Q);Q:=S;END{:759}
ELSE Q:=MEM[R].HH.RH;END;END{:757};21,22:CONFUSION(616);
23,24:DELETEMACREF(MEM[P+1].INT);END;MEM[P].HH.B0:=0;END;{:754}{753:}
PROCEDURE FLUSHCUREXP(V:SCALED);
BEGIN CASE CURTYPE OF 3,5,7,10,12,14,15,17,18:BEGIN RECYCLEVALUE(CUREXP)
;FREENODE(CUREXP,2);END;
6:IF MEM[CUREXP].HH.LH=0 THEN TOSSPEN(CUREXP)ELSE MEM[CUREXP].HH.LH:=MEM
[CUREXP].HH.LH-1;
4:BEGIN IF STRREF[CUREXP]<127 THEN IF STRREF[CUREXP]>1 THEN STRREF[
CUREXP]:=STRREF[CUREXP]-1 ELSE FLUSHSTRING(CUREXP);END;
8,11,13:TOSSKNOTLIST(CUREXP);9:TOSSEDGES(CUREXP);OTHERS:END;CURTYPE:=16;
CUREXP:=V;END;{:753}{760:}PROCEDURE FLUSHERROR(V:SCALED);BEGIN ERROR;
FLUSHCUREXP(V);END;PROCEDURE BACKERROR;FORWARD;PROCEDURE GETXNEXT;
FORWARD;PROCEDURE PUTGETERROR;BEGIN BACKERROR;GETXNEXT;END;
PROCEDURE PUTGETFLUSHE(V:SCALED);BEGIN PUTGETERROR;FLUSHCUREXP(V);END;
{:760}{238:}PROCEDURE FLUSHBELOWVA(P:HALFWORD);VAR Q,R:HALFWORD;
BEGIN IF MEM[P].HH.B0<>22 THEN RECYCLEVALUE(P)ELSE BEGIN Q:=MEM[P+1].HH.
RH;WHILE MEM[Q].HH.B1=3 DO BEGIN FLUSHBELOWVA(Q);R:=Q;Q:=MEM[Q].HH.RH;
FREENODE(R,3);END;R:=MEM[P+1].HH.LH;Q:=MEM[R].HH.RH;RECYCLEVALUE(R);
FREENODE(R,2);REPEAT FLUSHBELOWVA(Q);R:=Q;Q:=MEM[Q].HH.RH;FREENODE(R,3);
UNTIL Q=22;MEM[P].HH.B0:=0;END;END;{:238}{249:}
PROCEDURE PRINTPATH(H:HALFWORD;S:STRNUMBER);LABEL 30,31;
VAR P,Q,R:HALFWORD;BEGIN PRINTDIAGNOS(370,S);PRINTLN;
IF MEM[H].HH.B0=5 THEN{250:}BEGIN PRINTTWO(MEM[H+1].INT,MEM[H+2].INT);
IF MEM[H].HH.B1=3 THEN BEGIN PRINT(373);PRINTSCALED(MEM[H+5].INT);
END ELSE BEGIN PRINTCHAR(123);PRINTSCALED(MEM[H+5].INT);PRINTCHAR(44);
PRINTSCALED(MEM[H+6].INT);END;PRINTCHAR(125);GOTO 30;END{:250};P:=H;
REPEAT Q:=MEM[P].HH.RH;IF(P=0)OR(Q=0)THEN BEGIN PRINTNL(131);GOTO 30;
END;{251:}PRINTTWO(MEM[P+1].INT,MEM[P+2].INT);
IF MEM[P].HH.B1<=1 THEN{252:}
IF MEM[P].HH.B0=2 THEN BEGIN R:=MEM[P+3].INT;PRINTCHAR(123);
PRINTSCALED(MEM[R+1].INT);PRINTCHAR(44);PRINTSCALED(MEM[R+2].INT);
PRINTCHAR(125);END ELSE IF MEM[P].HH.B0=3 THEN BEGIN PRINT(373);
PRINTSCALED(MEM[P+3].INT);PRINTCHAR(125);END{:252};
CASE MEM[P].HH.B1 OF 0:BEGIN IF MEM[P].HH.B0=4 THEN PRINT(374);
IF(MEM[Q].HH.B0<>0)OR(Q<>H)THEN Q:=0;GOTO 31;END;1:{254:}
BEGIN PRINT(379);PRINTTWO(MEM[P+5].INT,MEM[P+6].INT);PRINT(377);
IF MEM[Q].HH.B0<>1 THEN PRINT(380)ELSE PRINTTWO(MEM[Q+3].INT,MEM[Q+4].
INT);GOTO 31;END{:254};4:{255:}
IF(MEM[P].HH.B0<>1)AND(MEM[P].HH.B0<>4)THEN PRINT(374){:255};3,2:{256:}
BEGIN IF MEM[P].HH.B0>=2 THEN IF MEM[P].HH.B0=4 THEN PRINT(380)ELSE IF(
MEM[P].HH.B0<>MEM[P].HH.B1)OR(MEM[P+3].INT<>MEM[P+5].INT)THEN BEGIN{252:
}IF MEM[P].HH.B0=2 THEN BEGIN R:=MEM[P+3].INT;PRINTCHAR(123);
PRINTSCALED(MEM[R+1].INT);PRINTCHAR(44);PRINTSCALED(MEM[R+2].INT);
PRINTCHAR(125);END ELSE IF MEM[P].HH.B0=3 THEN BEGIN PRINT(373);
PRINTSCALED(MEM[P+3].INT);PRINTCHAR(125);END{:252};PRINTCHAR(38);
PRINTTWO(MEM[P+1].INT,MEM[P+2].INT);END;
IF MEM[P].HH.B1=3 THEN BEGIN PRINT(373);PRINTSCALED(MEM[P+5].INT);
PRINTCHAR(125);END ELSE BEGIN R:=MEM[P+5].INT;PRINTCHAR(123);
PRINTSCALED(MEM[R+1].INT);PRINTCHAR(44);PRINTSCALED(MEM[R+2].INT);
PRINTCHAR(125);END;END{:256};OTHERS:PRINT(131)END;
IF MEM[Q].HH.B0<=1 THEN PRINT(375)ELSE IF(MEM[P+6].INT<>65536)OR(MEM[Q+4
].INT<>65536)THEN{253:}IF MEM[P+6].INT<>0 THEN BEGIN PRINT(376);
PRINTSCALED(MEM[P+6].INT);
IF MEM[P+6].INT<>MEM[Q+4].INT THEN BEGIN PRINT(377);
PRINTSCALED(MEM[Q+4].INT);END;END ELSE BEGIN PRINT(378);
IF MEM[Q+4].INT<>0 THEN PRINTCHAR(63);END{:253};31:{:251};P:=Q;
IF P<>H THEN PRINTNL(371);UNTIL P=H;
IF MEM[H].HH.B0<>0 THEN PRINTNL(372);30:ENDDIAGNOSTI(TRUE);END;{:249}
{326:}{327:}PROCEDURE PRINTWEIGHT(Q:HALFWORD);VAR W,M:INTEGER;D:INTEGER;
BEGIN D:=0+MEM[Q].HH.LH-0;W:=D MOD 8;M:=(D DIV 8)-MEM[CUREDGES+3].HH.LH;
IF FILEOFFSET>MAXPRINTLINE-9 THEN PRINTNL(32)ELSE PRINTCHAR(32);
PRINTINT(M);WHILE W>4 DO BEGIN PRINTCHAR(43);W:=W-1;END;
WHILE W<4 DO BEGIN PRINTCHAR(45);W:=W+1;END;END;{:327}
PROCEDURE PRINTEDGES(H:HALFWORD;S:STRNUMBER);VAR P,Q:HALFWORD;N:INTEGER;
BEGIN PRINTDIAGNOS(387,S);P:=MEM[H].HH.LH;N:=MEM[H+1].HH.RH-4096;
WHILE P<>H DO BEGIN PRINTNL(388);PRINTINT(N);PRINTCHAR(58);
Q:=MEM[P+1].HH.LH;WHILE Q>1 DO BEGIN PRINTWEIGHT(Q);Q:=MEM[Q].HH.RH;END;
PRINT(389);Q:=MEM[P+1].HH.RH;WHILE Q>2500 DO BEGIN PRINTWEIGHT(Q);
Q:=MEM[Q].HH.RH;END;P:=MEM[P].HH.LH;N:=N-1;END;ENDDIAGNOSTI(TRUE);END;
{:326}{373:}PROCEDURE UNROTATE(X,Y:SCALED;OCTANT:SMALLNUMBER);
BEGIN CASE OCTANT OF 1:BEGIN CURX:=X;CURY:=Y;END;5:BEGIN CURX:=Y;
CURY:=X;END;6:BEGIN CURX:=-Y;CURY:=X;END;2:BEGIN CURX:=-X;CURY:=Y;END;
4:BEGIN CURX:=-X;CURY:=-Y;END;8:BEGIN CURX:=-Y;CURY:=-X;END;
7:BEGIN CURX:=Y;CURY:=-X;END;3:BEGIN CURX:=X;CURY:=-Y;END;END;END;{:373}
{432:}PROCEDURE PRINTPEN(P:HALFWORD;S:STRNUMBER);
VAR NOTHINGPRINT:BOOLEAN;K:1..8;H:HALFWORD;M,N:INTEGER;W,WW:HALFWORD;
BEGIN PRINTDIAGNOS(416,S);NOTHINGPRINT:=TRUE;PRINTLN;
FOR K:=1 TO 8 DO BEGIN OCTANT:=OCTANTCODE[K];H:=P+OCTANT;
N:=MEM[H].HH.LH;W:=MEM[H].HH.RH;IF NOT ODD(K)THEN W:=MEM[W].HH.LH;
FOR M:=1 TO N+1 DO BEGIN IF ODD(K)THEN WW:=MEM[W].HH.RH ELSE WW:=MEM[W].
HH.LH;
IF(MEM[WW+1].INT<>MEM[W+1].INT)OR(MEM[WW+2].INT<>MEM[W+2].INT)THEN{433:}
BEGIN IF NOTHINGPRINT THEN NOTHINGPRINT:=FALSE ELSE PRINTNL(418);
UNROTATE(MEM[WW+1].INT+MEM[WW+2].INT,MEM[WW+2].INT,OCTANT);
PRINTTWO(CURX,CURY);END{:433};W:=WW;END;END;
IF NOTHINGPRINT THEN BEGIN W:=MEM[P+1].HH.RH;
PRINTTWO(MEM[W+1].INT+MEM[W+2].INT,MEM[W+2].INT);END;PRINTNL(417);
ENDDIAGNOSTI(TRUE);END;{:432}{542:}PROCEDURE PRINTDEPENDE(P:HALFWORD;
T:SMALLNUMBER);LABEL 10;VAR V:INTEGER;PP,Q:HALFWORD;BEGIN PP:=P;
WHILE TRUE DO BEGIN V:=ABS(MEM[P+1].INT);Q:=MEM[P].HH.LH;
IF Q=0 THEN BEGIN IF(V<>0)OR(P=PP)THEN BEGIN IF MEM[P+1].INT>0 THEN IF P
<>PP THEN PRINTCHAR(43);PRINTSCALED(MEM[P+1].INT);END;GOTO 10;END;{543:}
IF MEM[P+1].INT<0 THEN PRINTCHAR(45)ELSE IF P<>PP THEN PRINTCHAR(43);
IF T=17 THEN BEGIN IF V<>268435456 THEN PRINTSCALED(ROUNDFRACTIO(V));
END ELSE IF V<>65536 THEN PRINTSCALED(V){:543};
IF MEM[Q].HH.B0<>20 THEN CONFUSION(435);PRINTVARIABL(Q);V:=MEM[Q+1].INT;
WHILE V>0 DO BEGIN PRINT(436);V:=V-2;END;P:=MEM[P].HH.RH;END;10:END;
{:542}{746:}{750:}PROCEDURE PRINTDP(T:SMALLNUMBER;P:HALFWORD;
VERBOSITY:SMALLNUMBER);VAR Q:HALFWORD;BEGIN Q:=MEM[P].HH.RH;
IF(MEM[Q].HH.LH=0)OR(VERBOSITY>0)THEN PRINTDEPENDE(P,T)ELSE PRINT(614);
END;{:750}{744:}FUNCTION STASHCUREXP:HALFWORD;VAR P:HALFWORD;
BEGIN CASE CURTYPE OF 3,5,7,10,12,14,15,17,18:P:=CUREXP;
OTHERS:BEGIN P:=GETNODE(2);MEM[P].HH.B1:=11;MEM[P].HH.B0:=CURTYPE;
MEM[P+1].INT:=CUREXP;END END;CURTYPE:=1;MEM[P].HH.RH:=1;STASHCUREXP:=P;
END;{:744}{745:}PROCEDURE UNSTASHCUREX(P:HALFWORD);VAR Q:HALFWORD;
BEGIN CURTYPE:=MEM[P].HH.B0;
CASE CURTYPE OF 3,5,7,10,12,14,15,17,18:CUREXP:=P;
OTHERS:BEGIN CUREXP:=MEM[P+1].INT;FREENODE(P,2);END END;END;{:745}
PROCEDURE PRINTEXP(P:HALFWORD;VERBOSITY:SMALLNUMBER);
VAR RESTORECUREX:BOOLEAN;T:SMALLNUMBER;V:INTEGER;Q:HALFWORD;
BEGIN IF P<>0 THEN RESTORECUREX:=FALSE ELSE BEGIN P:=STASHCUREXP;
RESTORECUREX:=TRUE;END;T:=MEM[P].HH.B0;
IF T<17 THEN V:=MEM[P+1].INT ELSE V:=MEM[P+1].HH.RH;{747:}
CASE T OF 1:PRINT(197);2:IF V=30 THEN PRINT(222)ELSE PRINT(223);
3,5,7,10,12,19:{751:}BEGIN PRINTTYPE(T);
IF V<>0 THEN BEGIN PRINTCHAR(32);
WHILE MEM[V].HH.B1=11 DO V:=MEM[V+1].INT;PRINTVARIABL(V);END;END{:751};
4:BEGIN PRINTCHAR(34);PRINT(V);PRINTCHAR(34);END;6,8,9,11,13:{749:}
BEGIN IF VERBOSITY<=1 THEN PRINTTYPE(T)ELSE CASE T OF 6:PRINTPEN(V,311);
8:PRINTPATH(V,612);11:PRINTPATH(V,311);13:PRINTPATH(V,613);
9:PRINTEDGES(V,311);END;END{:749};
14,15:IF V=0 THEN PRINTTYPE(T)ELSE{748:}BEGIN PRINTCHAR(40);
Q:=V+BIGNODESIZE[T];
REPEAT IF MEM[V].HH.B0=16 THEN PRINTSCALED(MEM[V+1].INT)ELSE IF MEM[V].
HH.B0=20 THEN PRINTVARIABL(V)ELSE PRINTDP(MEM[V].HH.B0,MEM[V+1].HH.RH,
VERBOSITY);V:=V+2;IF V<>Q THEN PRINTCHAR(44);UNTIL V=Q;PRINTCHAR(41);
END{:748};16:PRINTSCALED(V);17,18:PRINTDP(T,V,VERBOSITY);
20:PRINTVARIABL(P);OTHERS:CONFUSION(611)END{:747};
IF RESTORECUREX THEN UNSTASHCUREX(P);END;{:746}{752:}
PROCEDURE DISPERR(P:HALFWORD;S:STRNUMBER);
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(615);PRINTEXP(P,1);
IF S<>311 THEN BEGIN PRINTNL(133);PRINT(S);END;END;{:752}
PROCEDURE FLUSHVARIABL(P,T:HALFWORD;DISCARDSUFFI:BOOLEAN);LABEL 10;
VAR Q,R:HALFWORD;N:HALFWORD;
BEGIN WHILE T<>0 DO BEGIN IF MEM[P].HH.B0<>22 THEN GOTO 10;
N:=MEM[T].HH.LH;T:=MEM[T].HH.RH;IF N=0 THEN BEGIN R:=P+1;
Q:=MEM[R].HH.RH;
WHILE MEM[Q].HH.B1=3 DO BEGIN FLUSHVARIABL(Q,T,DISCARDSUFFI);
IF T=0 THEN IF MEM[Q].HH.B0=22 THEN R:=Q ELSE BEGIN MEM[R].HH.RH:=MEM[Q]
.HH.RH;FREENODE(Q,3);END ELSE R:=Q;Q:=MEM[R].HH.RH;END;END;
P:=MEM[P+1].HH.LH;REPEAT R:=P;P:=MEM[P].HH.RH;UNTIL MEM[P+2].HH.LH>=N;
IF MEM[P+2].HH.LH<>N THEN GOTO 10;END;
IF DISCARDSUFFI THEN FLUSHBELOWVA(P)ELSE BEGIN IF MEM[P].HH.B0=22 THEN P
:=MEM[P+1].HH.LH;RECYCLEVALUE(P);END;10:END;{:237}{239:}
FUNCTION UNDTYPE(P:HALFWORD):SMALLNUMBER;
BEGIN CASE MEM[P].HH.B0 OF 0,1:UNDTYPE:=0;2,3:UNDTYPE:=3;4,5:UNDTYPE:=5;
6,7,8:UNDTYPE:=7;9,10:UNDTYPE:=10;11,12,13:UNDTYPE:=12;
14,15,19:UNDTYPE:=MEM[P].HH.B0;16,17,18,20:UNDTYPE:=19;END;END;{:239}
{240:}PROCEDURE CLEARSYMBOL(P:HALFWORD;SAVING:BOOLEAN);VAR Q:HALFWORD;
BEGIN Q:=EQTB[P].RH;
CASE EQTB[P].LH MOD 82 OF 8,53,43,48:IF NOT SAVING THEN DELETEMACREF(Q);
39:IF Q<>0 THEN IF SAVING THEN MEM[Q].HH.B1:=1 ELSE BEGIN FLUSHBELOWVA(Q
);FREENODE(Q,2);END;OTHERS:END;EQTB[P]:=EQTB[2243];END;{:240}{243:}
PROCEDURE SAVEVARIABLE(Q:HALFWORD);VAR P:HALFWORD;
BEGIN IF SAVEPTR<>0 THEN BEGIN P:=GETNODE(2);MEM[P].HH.LH:=Q;
MEM[P].HH.RH:=SAVEPTR;MEM[P+1].HH:=EQTB[Q];SAVEPTR:=P;END;
CLEARSYMBOL(Q,(SAVEPTR<>0));END;{:243}{244:}
PROCEDURE SAVEINTERNAL(Q:HALFWORD);VAR P:HALFWORD;
BEGIN IF SAVEPTR<>0 THEN BEGIN P:=GETNODE(2);MEM[P].HH.LH:=2243+Q;
MEM[P].HH.RH:=SAVEPTR;MEM[P+1].INT:=INTERNAL[Q];SAVEPTR:=P;END;END;
{:244}{245:}PROCEDURE UNSAVE;VAR Q:HALFWORD;P:HALFWORD;
BEGIN WHILE MEM[SAVEPTR].HH.LH<>0 DO BEGIN Q:=MEM[SAVEPTR].HH.LH;
IF Q>2243 THEN BEGIN INTERNAL[Q-(2243)]:=MEM[SAVEPTR+1].INT;
END ELSE BEGIN CLEARSYMBOL(Q,FALSE);EQTB[Q]:=MEM[SAVEPTR+1].HH;
IF EQTB[Q].LH MOD 82=39 THEN BEGIN P:=EQTB[Q].RH;
IF P<>0 THEN MEM[P].HH.B1:=0;END;END;P:=MEM[SAVEPTR].HH.RH;
FREENODE(SAVEPTR,2);SAVEPTR:=P;END;P:=MEM[SAVEPTR].HH.RH;
BEGIN MEM[SAVEPTR].HH.RH:=AVAIL;AVAIL:=SAVEPTR;DYNUSED:=DYNUSED-1;END;
SAVEPTR:=P;END;{:245}{257:}FUNCTION COPYKNOT(P:HALFWORD):HALFWORD;
VAR Q:HALFWORD;K:0..6;BEGIN Q:=GETNODE(7);
FOR K:=0 TO 6 DO MEM[Q+K]:=MEM[P+K];COPYKNOT:=Q;END;{:257}{258:}
FUNCTION COPYPATH(P:HALFWORD):HALFWORD;LABEL 10;VAR Q,PP,QQ:HALFWORD;
BEGIN Q:=GETNODE(7);QQ:=Q;PP:=P;
WHILE TRUE DO BEGIN MEM[QQ].HH.B0:=MEM[PP].HH.B0;
MEM[QQ].HH.B1:=MEM[PP].HH.B1;MEM[QQ+1].INT:=MEM[PP+1].INT;
MEM[QQ+2].INT:=MEM[PP+2].INT;MEM[QQ+3].INT:=MEM[PP+3].INT;
MEM[QQ+4].INT:=MEM[PP+4].INT;MEM[QQ+5].INT:=MEM[PP+5].INT;
MEM[QQ+6].INT:=MEM[PP+6].INT;
IF MEM[PP].HH.RH=P THEN BEGIN MEM[QQ].HH.RH:=Q;COPYPATH:=Q;GOTO 10;END;
MEM[QQ].HH.RH:=GETNODE(7);QQ:=MEM[QQ].HH.RH;PP:=MEM[PP].HH.RH;END;
10:END;{:258}{259:}FUNCTION HTAPYPOC(P:HALFWORD):HALFWORD;LABEL 10;
VAR Q,PP,QQ,RR:HALFWORD;BEGIN Q:=GETNODE(7);QQ:=Q;PP:=P;
WHILE TRUE DO BEGIN MEM[QQ].HH.B1:=MEM[PP].HH.B0;
MEM[QQ].HH.B0:=MEM[PP].HH.B1;MEM[QQ+1].INT:=MEM[PP+1].INT;
MEM[QQ+2].INT:=MEM[PP+2].INT;MEM[QQ+5].INT:=MEM[PP+3].INT;
MEM[QQ+6].INT:=MEM[PP+4].INT;MEM[QQ+3].INT:=MEM[PP+5].INT;
MEM[QQ+4].INT:=MEM[PP+6].INT;
IF MEM[PP].HH.RH=P THEN BEGIN MEM[Q].HH.RH:=QQ;PATHTAIL:=PP;HTAPYPOC:=Q;
GOTO 10;END;RR:=GETNODE(7);MEM[RR].HH.RH:=QQ;QQ:=RR;PP:=MEM[PP].HH.RH;
END;10:END;{:259}{263:}{290:}
FUNCTION CURLRATIO(GAMMA,ATENSION,BTENSION:SCALED):FRACTION;
VAR ALPHA,BETA,NUM,DENOM,FF:FRACTION;
BEGIN ALPHA:=MAKEFRACTION(65536,ATENSION);
BETA:=MAKEFRACTION(65536,BTENSION);
IF ALPHA<=BETA THEN BEGIN FF:=MAKEFRACTION(ALPHA,BETA);
FF:=TAKEFRACTION(FF,FF);GAMMA:=TAKEFRACTION(GAMMA,FF);
BETA:=BETA DIV 4096;DENOM:=TAKEFRACTION(GAMMA,ALPHA)+196608-BETA;
NUM:=TAKEFRACTION(GAMMA,805306368-ALPHA)+BETA;
END ELSE BEGIN FF:=MAKEFRACTION(BETA,ALPHA);FF:=TAKEFRACTION(FF,FF);
BETA:=TAKEFRACTION(BETA,FF)DIV 4096;
DENOM:=TAKEFRACTION(GAMMA,ALPHA)+(FF DIV 1365)-BETA;
NUM:=TAKEFRACTION(GAMMA,805306368-ALPHA)+BETA;END;
IF NUM>=DENOM+DENOM+DENOM+DENOM THEN CURLRATIO:=1073741824 ELSE
CURLRATIO:=MAKEFRACTION(NUM,DENOM);END;{:290}{293:}
PROCEDURE SETCONTROLS(P,Q:HALFWORD;K:INTEGER);VAR RR,SS:FRACTION;
LT,RT:SCALED;SINE:FRACTION;V:FRACTION;BEGIN LT:=MEM[Q+4].INT;
IF LT<>0 THEN RT:=MEM[P+6].INT ELSE BEGIN LT:=65536;RT:=65536;END;
RR:=VELOCITY(ST,CT,SF,CF,RT);SS:=VELOCITY(SF,CF,ST,CT,LT);
IF MEM[Q+4].INT=0 THEN{294:}
IF((ST>=0)AND(SF>=0))OR((ST<=0)AND(SF<=0))THEN BEGIN SINE:=TAKEFRACTION(
ABS(ST),CF)+TAKEFRACTION(ABS(SF),CT);
IF SINE>0 THEN BEGIN IF ABVSCD(ABS(SF),268435456,RR,SINE)<0 THEN RR:=
MAKEFRACTION(ABS(SF),SINE);
IF ABVSCD(ABS(ST),268435456,SS,SINE)<0 THEN SS:=MAKEFRACTION(ABS(ST),
SINE);END;END{:294};
MEM[P+5].INT:=MEM[P+1].INT+TAKEFRACTION(TAKEFRACTION(DELTAX[K],CT)-
TAKEFRACTION(DELTAY[K],ST),RR);
MEM[P+6].INT:=MEM[P+2].INT+TAKEFRACTION(TAKEFRACTION(DELTAY[K],CT)+
TAKEFRACTION(DELTAX[K],ST),RR);
MEM[Q+3].INT:=MEM[Q+1].INT-TAKEFRACTION(TAKEFRACTION(DELTAX[K],CF)+
TAKEFRACTION(DELTAY[K],SF),SS);
MEM[Q+4].INT:=MEM[Q+2].INT-TAKEFRACTION(TAKEFRACTION(DELTAY[K],CF)-
TAKEFRACTION(DELTAX[K],SF),SS);MEM[P].HH.B1:=1;MEM[Q].HH.B0:=1;END;
{:293}PROCEDURE MAKECHOICES(KNOTS,COORDS:HALFWORD);LABEL 30,31,40;
VAR H:HALFWORD;P,Q:HALFWORD;{274:}K,N:0..PATHSIZE;R,S,T:HALFWORD;
SINE,COSINE:FRACTION;{:274}{280:}AA,BB,CC,FF,ACC:FRACTION;DD,EE:SCALED;
LT,RT:SCALED;{:280}BEGIN BEGIN IF ARITHERROR THEN CLEARARITH;END;
IF INTERNAL[3]>0 THEN PRINTPATH(KNOTS,381);{265:}P:=KNOTS;
REPEAT Q:=MEM[P].HH.RH;
IF MEM[P+1].INT=MEM[Q+1].INT THEN IF MEM[P+2].INT=MEM[Q+2].INT THEN IF
MEM[P].HH.B1>1 THEN BEGIN MEM[P].HH.B1:=1;
IF MEM[P].HH.B0=4 THEN BEGIN MEM[P].HH.B0:=3;MEM[P+3].INT:=65536;END;
MEM[Q].HH.B0:=1;IF MEM[Q].HH.B1=4 THEN BEGIN MEM[Q].HH.B1:=3;
MEM[P+5].INT:=65536;END;MEM[P+5].INT:=MEM[P+1].INT;
MEM[Q+3].INT:=MEM[P+1].INT;MEM[P+6].INT:=MEM[P+2].INT;
MEM[Q+4].INT:=MEM[P+2].INT;END;P:=Q;UNTIL P=KNOTS{:265};{266:}H:=KNOTS;
WHILE TRUE DO BEGIN IF MEM[H].HH.B0<>4 THEN GOTO 31;
IF MEM[H].HH.B1<>4 THEN GOTO 31;H:=MEM[H].HH.RH;
IF H=KNOTS THEN BEGIN MEM[H].HH.B0:=5;GOTO 31;END;END;31:{:266};P:=H;
REPEAT{267:}Q:=MEM[P].HH.RH;
IF MEM[P].HH.B1>=2 THEN BEGIN WHILE(MEM[Q].HH.B0=4)AND(MEM[Q].HH.B1=4)DO
Q:=MEM[Q].HH.RH;{272:}{275:}K:=0;S:=P;N:=PATHSIZE;
REPEAT T:=MEM[S].HH.RH;DELTAX[K]:=MEM[T+1].INT-MEM[S+1].INT;
DELTAY[K]:=MEM[T+2].INT-MEM[S+2].INT;
DELTA[K]:=PYTHADD(DELTAX[K],DELTAY[K]);
IF K>0 THEN BEGIN SINE:=MAKEFRACTION(DELTAY[K-1],DELTA[K-1]);
COSINE:=MAKEFRACTION(DELTAX[K-1],DELTA[K-1]);
PSI[K]:=NARG(TAKEFRACTION(DELTAX[K],COSINE)+TAKEFRACTION(DELTAY[K],SINE)
,TAKEFRACTION(DELTAY[K],COSINE)-TAKEFRACTION(DELTAX[K],SINE));END;
K:=K+1;S:=T;IF K=PATHSIZE THEN OVERFLOW(386,PATHSIZE);IF S=Q THEN N:=K;
UNTIL(K>=N)AND(MEM[S].HH.B0<>5);
IF K=N THEN PSI[N]:=0 ELSE PSI[K]:=PSI[1]{:275};{276:}
IF MEM[Q].HH.B0=4 THEN BEGIN MEM[22].INT:=MEM[Q+5].INT-MEM[Q+1].INT;
MEM[23].INT:=MEM[Q+6].INT-MEM[Q+2].INT;
IF(MEM[22].INT=0)AND(MEM[23].INT=0)THEN BEGIN MEM[Q].HH.B0:=3;
MEM[Q+3].INT:=65536;END ELSE BEGIN MEM[Q].HH.B0:=2;MEM[Q+3].INT:=21;END;
END;
IF(MEM[P].HH.B1=4)AND(MEM[P].HH.B0=1)THEN BEGIN MEM[15].INT:=MEM[P+1].
INT-MEM[P+3].INT;MEM[16].INT:=MEM[P+2].INT-MEM[P+4].INT;
IF(MEM[15].INT=0)AND(MEM[16].INT=0)THEN BEGIN MEM[P].HH.B1:=3;
MEM[P+5].INT:=65536;END ELSE BEGIN MEM[P].HH.B1:=2;MEM[P+5].INT:=14;
END END{:276};{278:}K:=0;S:=P;WHILE TRUE DO BEGIN T:=MEM[S].HH.RH;
IF K=0 THEN{279:}CASE MEM[S].HH.B1 OF 2:IF MEM[T].HH.B0=2 THEN{295:}
BEGIN COSINE:=MAKEFRACTION(DELTAX[0],DELTA[0]);
SINE:=MAKEFRACTION(DELTAY[0],DELTA[0]);R:=MEM[P+5].INT;
CT:=TAKEFRACTION(MEM[R+1].INT,COSINE)+TAKEFRACTION(MEM[R+2].INT,SINE);
ST:=TAKEFRACTION(MEM[R+2].INT,COSINE)-TAKEFRACTION(MEM[R+1].INT,SINE);
AA:=PYTHADD(ST,CT);CT:=MAKEFRACTION(CT,AA);ST:=MAKEFRACTION(ST,AA);
R:=MEM[Q+3].INT;
CF:=TAKEFRACTION(MEM[R+1].INT,COSINE)+TAKEFRACTION(MEM[R+2].INT,SINE);
SF:=-TAKEFRACTION(MEM[R+2].INT,COSINE)+TAKEFRACTION(MEM[R+1].INT,SINE);
AA:=PYTHADD(SF,CF);CF:=MAKEFRACTION(CF,AA);SF:=MAKEFRACTION(SF,AA);
SETCONTROLS(P,Q,0);GOTO 30;END{:295}ELSE{287:}BEGIN R:=MEM[S+5].INT;
SINE:=MAKEFRACTION(DELTAY[0],DELTA[0]);
COSINE:=MAKEFRACTION(DELTAX[0],DELTA[0]);
VV[0]:=NARG(TAKEFRACTION(MEM[R+1].INT,COSINE)+TAKEFRACTION(MEM[R+2].INT,
SINE),TAKEFRACTION(MEM[R+2].INT,COSINE)-TAKEFRACTION(MEM[R+1].INT,SINE))
;UU[0]:=0;WW[0]:=0;END{:287};3:IF MEM[T].HH.B0=3 THEN{296:}
BEGIN MEM[P].HH.B1:=1;MEM[Q].HH.B0:=1;LT:=MEM[Q+4].INT;
IF LT<>0 THEN RT:=MEM[P+6].INT ELSE BEGIN LT:=65536;RT:=65536;END;
IF RT=65536 THEN BEGIN MEM[P+5].INT:=MEM[P+1].INT+((DELTAX[0]+1)DIV 3);
MEM[P+6].INT:=MEM[P+2].INT+((DELTAY[0]+1)DIV 3);
END ELSE BEGIN FF:=MAKEFRACTION(65536,3*RT);
MEM[P+5].INT:=MEM[P+1].INT+TAKEFRACTION(DELTAX[0],FF);
MEM[P+6].INT:=MEM[P+2].INT+TAKEFRACTION(DELTAY[0],FF);END;
IF LT=65536 THEN BEGIN MEM[Q+3].INT:=MEM[Q+1].INT-((DELTAX[0]+1)DIV 3);
MEM[Q+4].INT:=MEM[Q+2].INT-((DELTAY[0]+1)DIV 3);
END ELSE BEGIN FF:=MAKEFRACTION(65536,3*LT);
MEM[Q+3].INT:=MEM[Q+1].INT-TAKEFRACTION(DELTAX[0],FF);
MEM[Q+4].INT:=MEM[Q+2].INT-TAKEFRACTION(DELTAY[0],FF);END;GOTO 30;
END{:296}ELSE{288:}BEGIN CC:=MEM[S+5].INT;LT:=MEM[T+4].INT;
IF LT<>0 THEN RT:=MEM[S+6].INT ELSE BEGIN LT:=65536;RT:=65536;END;
IF(RT=65536)AND(LT=65536)THEN UU[0]:=MAKEFRACTION(CC+CC+65536,CC+131072)
ELSE UU[0]:=CURLRATIO(CC,RT,LT);VV[0]:=-TAKEFRACTION(PSI[1],UU[0]);
WW[0]:=0;END{:288};4:BEGIN UU[0]:=0;VV[0]:=0;WW[0]:=268435456;END;
END{:279}ELSE CASE MEM[S].HH.B0 OF 5,4:{281:}BEGIN{282:}
IF(MEM[R+6].INT=65536)OR(MEM[R+6].INT=0)THEN BEGIN AA:=134217728;
DD:=2*DELTA[K];
END ELSE BEGIN AA:=MAKEFRACTION(65536,3*MEM[R+6].INT-65536);
DD:=TAKEFRACTION(DELTA[K],805306368-MAKEFRACTION(65536,MEM[R+6].INT));
END;IF(MEM[T+4].INT=65536)OR(MEM[T+4].INT=0)THEN BEGIN BB:=134217728;
EE:=2*DELTA[K-1];
END ELSE BEGIN BB:=MAKEFRACTION(65536,3*MEM[T+4].INT-65536);
EE:=TAKEFRACTION(DELTA[K-1],805306368-MAKEFRACTION(65536,MEM[T+4].INT));
END;CC:=268435456-TAKEFRACTION(UU[K-1],AA){:282};{283:}
DD:=TAKEFRACTION(DD,CC);LT:=MEM[S+4].INT;RT:=MEM[S+6].INT;
IF LT=0 THEN LT:=65536;IF RT=0 THEN RT:=65536;
IF LT<>RT THEN IF LT<RT THEN BEGIN FF:=MAKEFRACTION(LT,RT);
FF:=TAKEFRACTION(FF,FF);DD:=TAKEFRACTION(DD,FF);
END ELSE BEGIN FF:=MAKEFRACTION(RT,LT);FF:=TAKEFRACTION(FF,FF);
EE:=TAKEFRACTION(EE,FF);END;FF:=MAKEFRACTION(EE,EE+DD){:283};
UU[K]:=TAKEFRACTION(FF,BB);{284:}ACC:=-TAKEFRACTION(PSI[K+1],UU[K]);
IF MEM[R].HH.B1=3 THEN BEGIN WW[K]:=0;
VV[K]:=ACC-TAKEFRACTION(PSI[1],268435456-FF);
END ELSE BEGIN FF:=MAKEFRACTION(268435456-FF,CC);
ACC:=ACC-TAKEFRACTION(PSI[K],FF);FF:=TAKEFRACTION(FF,AA);
VV[K]:=ACC-TAKEFRACTION(VV[K-1],FF);
IF WW[K-1]=0 THEN WW[K]:=0 ELSE WW[K]:=-TAKEFRACTION(WW[K-1],FF);
END{:284};IF MEM[S].HH.B0=5 THEN{285:}BEGIN AA:=0;BB:=268435456;
REPEAT K:=K-1;IF K=0 THEN K:=N;AA:=VV[K]-TAKEFRACTION(AA,UU[K]);
BB:=WW[K]-TAKEFRACTION(BB,UU[K]);UNTIL K=N;
AA:=MAKEFRACTION(AA,268435456-BB);THETA[N]:=AA;VV[0]:=AA;
FOR K:=1 TO N-1 DO VV[K]:=VV[K]+TAKEFRACTION(AA,WW[K]);GOTO 40;END{:285}
;END{:281};3:{289:}BEGIN CC:=MEM[S+3].INT;LT:=MEM[S+4].INT;
IF LT<>0 THEN RT:=MEM[R+6].INT ELSE BEGIN LT:=65536;RT:=65536;END;
IF(RT=65536)AND(LT=65536)THEN FF:=MAKEFRACTION(CC+CC+65536,CC+131072)
ELSE FF:=CURLRATIO(CC,LT,RT);
THETA[N]:=-MAKEFRACTION(TAKEFRACTION(VV[N-1],FF),268435456-TAKEFRACTION(
FF,UU[N-1]));GOTO 40;END{:289};2:{286:}BEGIN R:=MEM[S+3].INT;
SINE:=MAKEFRACTION(DELTAY[N-1],DELTA[N-1]);
COSINE:=MAKEFRACTION(DELTAX[N-1],DELTA[N-1]);
THETA[N]:=NARG(TAKEFRACTION(MEM[R+1].INT,COSINE)+TAKEFRACTION(MEM[R+2].
INT,SINE),TAKEFRACTION(MEM[R+2].INT,COSINE)-TAKEFRACTION(MEM[R+1].INT,
SINE));GOTO 40;END{:286};END;R:=S;S:=T;K:=K+1;END;40:{291:}
FOR K:=N-1 DOWNTO 0 DO THETA[K]:=VV[K]-TAKEFRACTION(THETA[K+1],UU[K]);
S:=P;K:=0;REPEAT T:=MEM[S].HH.RH;NSINCOS(THETA[K]);ST:=NSIN;CT:=NCOS;
NSINCOS(-PSI[K+1]-THETA[K+1]);SF:=NSIN;CF:=NCOS;SETCONTROLS(S,T,K);
K:=K+1;S:=T;UNTIL K=N{:291};30:{:278}{:272};END;P:=Q{:267};UNTIL P=H;
IF INTERNAL[3]>0 THEN PRINTPATH(KNOTS,382);
WHILE COORDS<>0 DO BEGIN P:=COORDS;COORDS:=MEM[P].HH.RH;FREENODE(P,3);
END;IF ARITHERROR THEN{264:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(383);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=384;HELPLINE[0]:=385;END;ERROR;
ARITHERROR:=FALSE;END{:264};END;{:263}{305:}
PROCEDURE MAKEMOVES(XX0,XX1,XX2,XX3,YY0,YY1,YY2,YY3:SCALED;
XICORR,ETACORR:SMALLNUMBER);LABEL 22,30,10;
VAR X1,X2,X3,M,R,Y1,Y2,Y3,N,S,L:INTEGER;Q,T,U,X2A,X3A,Y2A,Y3A:INTEGER;
BEGIN IF(XX3<XX0)OR(YY3<YY0)THEN CONFUSION(109);L:=16;BISECTPTR:=0;
X1:=XX1-XX0;X2:=XX2-XX1;X3:=XX3-XX2;
IF XX0>=XICORR THEN R:=(XX0-XICORR)MOD 65536 ELSE R:=65535-((-XX0+XICORR
-1)MOD 65536);M:=(XX3-XX0+R)DIV 65536;Y1:=YY1-YY0;Y2:=YY2-YY1;
Y3:=YY3-YY2;
IF YY0>=ETACORR THEN S:=(YY0-ETACORR)MOD 65536 ELSE S:=65535-((-YY0+
ETACORR-1)MOD 65536);N:=(YY3-YY0+S)DIV 65536;
IF(XX3-XX0>=268435456)OR(YY3-YY0>=268435456)THEN{307:}
BEGIN X1:=(X1+XICORR)DIV 2;X2:=(X2+XICORR)DIV 2;X3:=(X3+XICORR)DIV 2;
R:=(R+XICORR)DIV 2;Y1:=(Y1+ETACORR)DIV 2;Y2:=(Y2+ETACORR)DIV 2;
Y3:=(Y3+ETACORR)DIV 2;S:=(S+ETACORR)DIV 2;L:=15;END{:307};
WHILE TRUE DO BEGIN 22:{308:}IF M=0 THEN{309:}
WHILE N>0 DO BEGIN MOVEPTR:=MOVEPTR+1;MOVE[MOVEPTR]:=1;N:=N-1;END{:309}
ELSE IF N=0 THEN{310:}MOVE[MOVEPTR]:=MOVE[MOVEPTR]+M{:310}
ELSE IF M+N=2 THEN{311:}BEGIN R:=TWOTOTHE[L]-R;S:=TWOTOTHE[L]-S;
WHILE L<30 DO BEGIN X3A:=X3;X2A:=(X2+X3+XICORR)DIV 2;
X2:=(X1+X2+XICORR)DIV 2;X3:=(X2+X2A+XICORR)DIV 2;T:=X1+X2+X3;
R:=R+R-XICORR;Y3A:=Y3;Y2A:=(Y2+Y3+ETACORR)DIV 2;
Y2:=(Y1+Y2+ETACORR)DIV 2;Y3:=(Y2+Y2A+ETACORR)DIV 2;U:=Y1+Y2+Y3;
S:=S+S-ETACORR;IF T<R THEN IF U<S THEN{312:}BEGIN X1:=X3;X2:=X2A;
X3:=X3A;R:=R-T;Y1:=Y3;Y2:=Y2A;Y3:=Y3A;S:=S-U;END{:312}ELSE BEGIN{314:}
BEGIN MOVEPTR:=MOVEPTR+1;MOVE[MOVEPTR]:=2;END{:314};GOTO 30;
END ELSE IF U<S THEN BEGIN{313:}BEGIN MOVE[MOVEPTR]:=MOVE[MOVEPTR]+1;
MOVEPTR:=MOVEPTR+1;MOVE[MOVEPTR]:=1;END{:313};GOTO 30;END;L:=L+1;END;
R:=R-XICORR;S:=S-ETACORR;
IF ABVSCD(X1+X2+X3-R,S,Y1+Y2+Y3-S,R)-XICORR>=0 THEN{313:}
BEGIN MOVE[MOVEPTR]:=MOVE[MOVEPTR]+1;MOVEPTR:=MOVEPTR+1;
MOVE[MOVEPTR]:=1;END{:313}ELSE{314:}BEGIN MOVEPTR:=MOVEPTR+1;
MOVE[MOVEPTR]:=2;END{:314};30:END{:311}ELSE BEGIN L:=L+1;
BISECTSTACK[BISECTPTR+10]:=L;BISECTSTACK[BISECTPTR+2]:=X3;
BISECTSTACK[BISECTPTR+1]:=(X2+X3+XICORR)DIV 2;X2:=(X1+X2+XICORR)DIV 2;
X3:=(X2+BISECTSTACK[BISECTPTR+1]+XICORR)DIV 2;
BISECTSTACK[BISECTPTR]:=X3;R:=R+R+XICORR;T:=X1+X2+X3+R;
Q:=T DIV TWOTOTHE[L];BISECTSTACK[BISECTPTR+3]:=T MOD TWOTOTHE[L];
BISECTSTACK[BISECTPTR+4]:=M-Q;M:=Q;BISECTSTACK[BISECTPTR+7]:=Y3;
BISECTSTACK[BISECTPTR+6]:=(Y2+Y3+ETACORR)DIV 2;Y2:=(Y1+Y2+ETACORR)DIV 2;
Y3:=(Y2+BISECTSTACK[BISECTPTR+6]+ETACORR)DIV 2;
BISECTSTACK[BISECTPTR+5]:=Y3;S:=S+S+ETACORR;U:=Y1+Y2+Y3+S;
Q:=U DIV TWOTOTHE[L];BISECTSTACK[BISECTPTR+8]:=U MOD TWOTOTHE[L];
BISECTSTACK[BISECTPTR+9]:=N-Q;N:=Q;BISECTPTR:=BISECTPTR+11;GOTO 22;
END{:308};IF BISECTPTR=0 THEN GOTO 10;{306:}BISECTPTR:=BISECTPTR-11;
X1:=BISECTSTACK[BISECTPTR];X2:=BISECTSTACK[BISECTPTR+1];
X3:=BISECTSTACK[BISECTPTR+2];R:=BISECTSTACK[BISECTPTR+3];
M:=BISECTSTACK[BISECTPTR+4];Y1:=BISECTSTACK[BISECTPTR+5];
Y2:=BISECTSTACK[BISECTPTR+6];Y3:=BISECTSTACK[BISECTPTR+7];
S:=BISECTSTACK[BISECTPTR+8];N:=BISECTSTACK[BISECTPTR+9];
L:=BISECTSTACK[BISECTPTR+10]{:306};END;10:END;{:305}{315:}
PROCEDURE SMOOTHMOVES(B,T:INTEGER);VAR K:1..MOVESIZE;A,AA,AAA:INTEGER;
BEGIN IF T-B>=3 THEN BEGIN K:=B+2;AA:=MOVE[K-1];AAA:=MOVE[K-2];
REPEAT A:=MOVE[K];IF ABS(A-AA)>1 THEN{316:}
IF A>AA THEN BEGIN IF AAA>=AA THEN IF A>=MOVE[K+1]THEN BEGIN MOVE[K-1]:=
MOVE[K-1]+1;MOVE[K]:=A-1;END;
END ELSE BEGIN IF AAA<=AA THEN IF A<=MOVE[K+1]THEN BEGIN MOVE[K-1]:=MOVE
[K-1]-1;MOVE[K]:=A+1;END;END{:316};K:=K+1;AAA:=AA;AA:=A;UNTIL K=T;END;
END;{:315}{322:}PROCEDURE FIXOFFSET;VAR P,Q:HALFWORD;DELTA:INTEGER;
BEGIN DELTA:=8*(MEM[CUREDGES+3].HH.LH-4096);MEM[CUREDGES+3].HH.LH:=4096;
Q:=MEM[CUREDGES].HH.RH;WHILE Q<>CUREDGES DO BEGIN P:=MEM[Q+1].HH.RH;
WHILE P>2500 DO BEGIN MEM[P].HH.LH:=MEM[P].HH.LH-DELTA;P:=MEM[P].HH.RH;
END;P:=MEM[Q+1].HH.LH;
WHILE P>1 DO BEGIN MEM[P].HH.LH:=MEM[P].HH.LH-DELTA;P:=MEM[P].HH.RH;END;
Q:=MEM[Q].HH.RH;END;END;{:322}{323:}
PROCEDURE EDGEPREP(ML,MR,NL,NR:INTEGER);VAR DELTA:HALFWORD;P,Q:HALFWORD;
BEGIN ML:=ML+4096;MR:=MR+4096;NL:=NL+4096;NR:=NR+4095;
IF ML<MEM[CUREDGES+2].HH.LH THEN MEM[CUREDGES+2].HH.LH:=ML;
IF MR>MEM[CUREDGES+2].HH.RH THEN MEM[CUREDGES+2].HH.RH:=MR;
IF NOT(ABS(MEM[CUREDGES+2].HH.LH+MEM[CUREDGES+3].HH.LH-8192)<4096)OR NOT
(ABS(MEM[CUREDGES+2].HH.RH+MEM[CUREDGES+3].HH.LH-8192)<4096)THEN
FIXOFFSET;
IF MEM[CUREDGES].HH.RH=CUREDGES THEN BEGIN MEM[CUREDGES+1].HH.LH:=NR+1;
MEM[CUREDGES+1].HH.RH:=NR;END;IF NL<MEM[CUREDGES+1].HH.LH THEN{324:}
BEGIN DELTA:=MEM[CUREDGES+1].HH.LH-NL;MEM[CUREDGES+1].HH.LH:=NL;
P:=MEM[CUREDGES].HH.RH;REPEAT Q:=GETNODE(2);MEM[Q+1].HH.RH:=2500;
MEM[Q+1].HH.LH:=1;MEM[P].HH.LH:=Q;MEM[Q].HH.RH:=P;P:=Q;DELTA:=DELTA-1;
UNTIL DELTA=0;MEM[P].HH.LH:=CUREDGES;MEM[CUREDGES].HH.RH:=P;
IF MEM[CUREDGES+5].HH.RH=CUREDGES THEN MEM[CUREDGES+5].HH.LH:=NL-1;
END{:324};IF NR>MEM[CUREDGES+1].HH.RH THEN{325:}
BEGIN DELTA:=NR-MEM[CUREDGES+1].HH.RH;MEM[CUREDGES+1].HH.RH:=NR;
P:=MEM[CUREDGES].HH.LH;REPEAT Q:=GETNODE(2);MEM[Q+1].HH.RH:=2500;
MEM[Q+1].HH.LH:=1;MEM[P].HH.RH:=Q;MEM[Q].HH.LH:=P;P:=Q;DELTA:=DELTA-1;
UNTIL DELTA=0;MEM[P].HH.RH:=CUREDGES;MEM[CUREDGES].HH.LH:=P;
IF MEM[CUREDGES+5].HH.RH=CUREDGES THEN MEM[CUREDGES+5].HH.LH:=NR+1;
END{:325};END;{:323}{328:}FUNCTION COPYEDGES(H:HALFWORD):HALFWORD;
VAR P,R:HALFWORD;HH,PP,QQ,RR,SS:HALFWORD;BEGIN HH:=GETNODE(6);
MEM[HH+1]:=MEM[H+1];MEM[HH+2]:=MEM[H+2];MEM[HH+3]:=MEM[H+3];
MEM[HH+4]:=MEM[H+4];MEM[HH+5].HH.LH:=MEM[HH+1].HH.RH+1;
MEM[HH+5].HH.RH:=HH;P:=MEM[H].HH.RH;QQ:=HH;
WHILE P<>H DO BEGIN PP:=GETNODE(2);MEM[QQ].HH.RH:=PP;MEM[PP].HH.LH:=QQ;
{329:}R:=MEM[P+1].HH.RH;RR:=PP+1;WHILE R>2500 DO BEGIN SS:=GETAVAIL;
MEM[RR].HH.RH:=SS;RR:=SS;MEM[RR].HH.LH:=MEM[R].HH.LH;R:=MEM[R].HH.RH;
END;MEM[RR].HH.RH:=2500;R:=MEM[P+1].HH.LH;RR:=2501;
WHILE R>1 DO BEGIN SS:=GETAVAIL;MEM[RR].HH.RH:=SS;RR:=SS;
MEM[RR].HH.LH:=MEM[R].HH.LH;R:=MEM[R].HH.RH;END;MEM[RR].HH.RH:=R;
MEM[PP+1].HH.LH:=MEM[2501].HH.RH{:329};P:=MEM[P].HH.RH;QQ:=PP;END;
MEM[QQ].HH.RH:=HH;MEM[HH].HH.LH:=QQ;COPYEDGES:=HH;END;{:328}{330:}
PROCEDURE YREFLECTEDGE;VAR P,Q,R:HALFWORD;
BEGIN P:=MEM[CUREDGES+1].HH.LH;
MEM[CUREDGES+1].HH.LH:=8191-MEM[CUREDGES+1].HH.RH;
MEM[CUREDGES+1].HH.RH:=8191-P;
MEM[CUREDGES+5].HH.LH:=8191-MEM[CUREDGES+5].HH.LH;
P:=MEM[CUREDGES].HH.RH;Q:=CUREDGES;REPEAT R:=MEM[P].HH.RH;
MEM[P].HH.RH:=Q;MEM[Q].HH.LH:=P;Q:=P;P:=R;UNTIL Q=CUREDGES;
MEM[CUREDGES+4].INT:=0;END;{:330}{331:}PROCEDURE XREFLECTEDGE;
VAR P,Q,R,S:HALFWORD;M:INTEGER;BEGIN P:=MEM[CUREDGES+2].HH.LH;
MEM[CUREDGES+2].HH.LH:=8192-MEM[CUREDGES+2].HH.RH;
MEM[CUREDGES+2].HH.RH:=8192-P;
IF NOT(ABS(MEM[CUREDGES+2].HH.LH+MEM[CUREDGES+3].HH.LH-8192)<4096)OR NOT
(ABS(MEM[CUREDGES+2].HH.RH+MEM[CUREDGES+3].HH.LH-8192)<4096)THEN
FIXOFFSET;M:=(MEM[CUREDGES+3].HH.LH*8+4)*2;P:=MEM[CUREDGES].HH.RH;
REPEAT{333:}Q:=MEM[P+1].HH.RH;R:=2500;
WHILE Q<>2500 DO BEGIN S:=MEM[Q].HH.RH;MEM[Q].HH.RH:=R;R:=Q;
MEM[R].HH.LH:=M-MEM[Q].HH.LH;Q:=S;END;MEM[P+1].HH.RH:=R{:333};{332:}
Q:=MEM[P+1].HH.LH;WHILE Q>1 DO BEGIN MEM[Q].HH.LH:=M-MEM[Q].HH.LH;
Q:=MEM[Q].HH.RH;END{:332};P:=MEM[P].HH.RH;UNTIL P=CUREDGES;
MEM[CUREDGES+4].INT:=0;END;{:331}{334:}PROCEDURE SORTEDGES(H:HALFWORD);
LABEL 30;VAR K:HALFWORD;P,Q,R,S:HALFWORD;BEGIN R:=MEM[H+1].HH.LH;
MEM[H+1].HH.LH:=0;P:=MEM[R].HH.RH;MEM[R].HH.RH:=2500;MEM[2501].HH.RH:=R;
WHILE P>1 DO BEGIN K:=MEM[P].HH.LH;Q:=2501;REPEAT R:=Q;Q:=MEM[R].HH.RH;
UNTIL K<=MEM[Q].HH.LH;MEM[R].HH.RH:=P;R:=MEM[P].HH.RH;MEM[P].HH.RH:=Q;
P:=R;END;{335:}BEGIN R:=H+1;Q:=MEM[R].HH.RH;P:=MEM[2501].HH.RH;
WHILE TRUE DO BEGIN K:=MEM[P].HH.LH;WHILE K>MEM[Q].HH.LH DO BEGIN R:=Q;
Q:=MEM[R].HH.RH;END;MEM[R].HH.RH:=P;S:=MEM[P].HH.RH;MEM[P].HH.RH:=Q;
IF S=2500 THEN GOTO 30;R:=P;P:=S;END;30:END{:335};END;{:334}{336:}
PROCEDURE CULLEDGES(WPLUS,WMINUS:INTEGER);LABEL 30;VAR P,Q,R,S:HALFWORD;
W:INTEGER;D:INTEGER;M:INTEGER;MM:INTEGER;WW:INTEGER;PREVW:INTEGER;
N,MINN,MAXN:HALFWORD;MIND,MAXD:HALFWORD;BEGIN MIND:=65535;MAXD:=0;
MINN:=65535;MAXN:=0;P:=MEM[CUREDGES].HH.RH;N:=MEM[CUREDGES+1].HH.LH;
WHILE P<>CUREDGES DO BEGIN IF MEM[P+1].HH.LH>1 THEN SORTEDGES(P);
IF MEM[P+1].HH.RH>2500 THEN{337:}BEGIN R:=2501;Q:=MEM[P+1].HH.RH;WW:=0;
M:=1000000;PREVW:=0;
WHILE TRUE DO BEGIN IF Q=2500 THEN MM:=1000000 ELSE BEGIN D:=0+MEM[Q].HH
.LH-0;MM:=D DIV 8;WW:=WW+(D MOD 8)-4;END;IF MM>M THEN BEGIN{338:}
IF W<>PREVW THEN BEGIN S:=GETAVAIL;MEM[R].HH.RH:=S;
MEM[S].HH.LH:=8*M+4+W-PREVW;R:=S;PREVW:=W;END{:338};
IF Q=2500 THEN GOTO 30;END;M:=MM;
IF(WW>=WPLUS)OR(WW<=WMINUS)THEN W:=1 ELSE W:=0;S:=MEM[Q].HH.RH;
BEGIN MEM[Q].HH.RH:=AVAIL;AVAIL:=Q;DYNUSED:=DYNUSED-1;END;Q:=S;END;
30:MEM[R].HH.RH:=2500;MEM[P+1].HH.RH:=MEM[2501].HH.RH;
IF R<>2501 THEN{339:}BEGIN IF MINN=65535 THEN MINN:=N;MAXN:=N;
IF MIND>MEM[MEM[2501].HH.RH].HH.LH THEN MIND:=MEM[MEM[2501].HH.RH].HH.LH
;IF MAXD<MEM[R].HH.LH THEN MAXD:=MEM[R].HH.LH;END{:339};END{:337};
P:=MEM[P].HH.RH;N:=N+1;END;{340:}IF MINN>MAXN THEN{341:}
BEGIN P:=MEM[CUREDGES].HH.RH;WHILE P<>CUREDGES DO BEGIN Q:=MEM[P].HH.RH;
FREENODE(P,2);P:=Q;END;INITEDGES(CUREDGES);END{:341}
ELSE BEGIN N:=MEM[CUREDGES+1].HH.LH;MEM[CUREDGES+1].HH.LH:=MINN;
WHILE MINN>N DO BEGIN P:=MEM[CUREDGES].HH.RH;
MEM[CUREDGES].HH.RH:=MEM[P].HH.RH;MEM[MEM[P].HH.RH].HH.LH:=CUREDGES;
FREENODE(P,2);N:=N+1;END;N:=MEM[CUREDGES+1].HH.RH;
MEM[CUREDGES+1].HH.RH:=MAXN;MEM[CUREDGES+5].HH.LH:=MAXN+1;
MEM[CUREDGES+5].HH.RH:=CUREDGES;
WHILE MAXN<N DO BEGIN P:=MEM[CUREDGES].HH.LH;
MEM[CUREDGES].HH.LH:=MEM[P].HH.LH;MEM[MEM[P].HH.LH].HH.RH:=CUREDGES;
FREENODE(P,2);N:=N-1;END;
MEM[CUREDGES+2].HH.LH:=((0+MIND-0)DIV 8)-MEM[CUREDGES+3].HH.LH+4096;
MEM[CUREDGES+2].HH.RH:=((0+MAXD-0)DIV 8)-MEM[CUREDGES+3].HH.LH+4096;
END{:340};MEM[CUREDGES+4].INT:=0;END;{:336}{342:}PROCEDURE XYSWAPEDGES;
LABEL 30;VAR MMAGIC,NMAGIC:INTEGER;P,Q,R,S:HALFWORD;{345:}
MSPREAD:INTEGER;J,JJ:0..MOVESIZE;M,MM:INTEGER;PD,RD:INTEGER;
PM,RM:INTEGER;W:INTEGER;WW:INTEGER;DW:INTEGER;{:345}{351:}
EXTRAS:INTEGER;XW:-3..3;K:INTEGER;{:351}BEGIN{344:}
MSPREAD:=MEM[CUREDGES+2].HH.RH-MEM[CUREDGES+2].HH.LH;
IF MSPREAD>MOVESIZE THEN OVERFLOW(390,MOVESIZE);
FOR J:=0 TO MSPREAD DO MOVE[J]:=2500{:344};{343:}P:=GETNODE(2);
MEM[P+1].HH.RH:=2500;MEM[P+1].HH.LH:=0;MEM[P].HH.LH:=CUREDGES;
MEM[MEM[CUREDGES].HH.RH].HH.LH:=P;P:=GETNODE(2);MEM[P+1].HH.RH:=2500;
MEM[P].HH.LH:=MEM[CUREDGES].HH.LH;{:343};{353:}
MMAGIC:=MEM[CUREDGES+2].HH.LH+MEM[CUREDGES+3].HH.LH-4096;
NMAGIC:=8*MEM[CUREDGES+1].HH.RH+12{:353};REPEAT Q:=MEM[P].HH.LH;
IF MEM[Q+1].HH.LH>1 THEN SORTEDGES(Q);{346:}R:=MEM[P+1].HH.RH;
FREENODE(P,2);P:=R;PD:=0+MEM[P].HH.LH-0;PM:=PD DIV 8;R:=MEM[Q+1].HH.RH;
RD:=0+MEM[R].HH.LH-0;RM:=RD DIV 8;W:=0;
WHILE TRUE DO BEGIN IF PM<RM THEN MM:=PM ELSE MM:=RM;IF W<>0 THEN{350:}
IF M<>MM THEN BEGIN IF MM-MMAGIC>=MOVESIZE THEN CONFUSION(364);
EXTRAS:=(ABS(W)-1)DIV 3;
IF EXTRAS>0 THEN BEGIN IF W>0 THEN XW:=+3 ELSE XW:=-3;WW:=W-EXTRAS*XW;
END ELSE WW:=W;REPEAT J:=M-MMAGIC;
FOR K:=1 TO EXTRAS DO BEGIN S:=GETAVAIL;MEM[S].HH.LH:=NMAGIC+XW;
MEM[S].HH.RH:=MOVE[J];MOVE[J]:=S;END;S:=GETAVAIL;
MEM[S].HH.LH:=NMAGIC+WW;MEM[S].HH.RH:=MOVE[J];MOVE[J]:=S;M:=M+1;
UNTIL M=MM;END{:350};IF PD<RD THEN BEGIN DW:=(PD MOD 8)-4;{348:}
S:=MEM[P].HH.RH;BEGIN MEM[P].HH.RH:=AVAIL;AVAIL:=P;DYNUSED:=DYNUSED-1;
END;P:=S;PD:=0+MEM[P].HH.LH-0;PM:=PD DIV 8{:348};
END ELSE BEGIN IF R=2500 THEN GOTO 30;DW:=-((RD MOD 8)-4);{347:}
R:=MEM[R].HH.RH;RD:=0+MEM[R].HH.LH-0;RM:=RD DIV 8{:347};END;M:=MM;
W:=W+DW;END;30:{:346};P:=Q;NMAGIC:=NMAGIC-8;UNTIL MEM[P].HH.LH=CUREDGES;
FREENODE(P,2);{352:}MOVE[MSPREAD]:=0;J:=0;WHILE MOVE[J]=2500 DO J:=J+1;
IF J=MSPREAD THEN INITEDGES(CUREDGES)ELSE BEGIN MM:=MEM[CUREDGES+2].HH.
LH;MEM[CUREDGES+2].HH.LH:=MEM[CUREDGES+1].HH.LH;
MEM[CUREDGES+2].HH.RH:=MEM[CUREDGES+1].HH.RH+1;
MEM[CUREDGES+3].HH.LH:=4096;JJ:=MSPREAD-1;
WHILE MOVE[JJ]=2500 DO JJ:=JJ-1;MEM[CUREDGES+1].HH.LH:=J+MM;
MEM[CUREDGES+1].HH.RH:=JJ+MM;Q:=CUREDGES;REPEAT P:=GETNODE(2);
MEM[Q].HH.RH:=P;MEM[P].HH.LH:=Q;MEM[P+1].HH.RH:=MOVE[J];
MEM[P+1].HH.LH:=0;J:=J+1;Q:=P;UNTIL J>JJ;MEM[Q].HH.RH:=CUREDGES;
MEM[CUREDGES].HH.LH:=Q;MEM[CUREDGES+5].HH.LH:=MEM[CUREDGES+1].HH.RH+1;
MEM[CUREDGES+5].HH.RH:=CUREDGES;MEM[CUREDGES+4].INT:=0;END;{:352};END;
{:342}{354:}PROCEDURE MERGEEDGES(H:HALFWORD);LABEL 30;
VAR P,Q,R,PP,QQ,RR:HALFWORD;N:INTEGER;K:HALFWORD;DELTA:INTEGER;
BEGIN IF MEM[H].HH.RH<>H THEN BEGIN IF(MEM[H+2].HH.LH<MEM[CUREDGES+2].HH
.LH)OR(MEM[H+2].HH.RH>MEM[CUREDGES+2].HH.RH)OR(MEM[H+1].HH.LH<MEM[
CUREDGES+1].HH.LH)OR(MEM[H+1].HH.RH>MEM[CUREDGES+1].HH.RH)THEN EDGEPREP(
MEM[H+2].HH.LH-4096,MEM[H+2].HH.RH-4096,MEM[H+1].HH.LH-4096,MEM[H+1].HH.
RH-4095);IF MEM[H+3].HH.LH<>MEM[CUREDGES+3].HH.LH THEN{355:}
BEGIN PP:=MEM[H].HH.RH;DELTA:=8*(MEM[CUREDGES+3].HH.LH-MEM[H+3].HH.LH);
REPEAT QQ:=MEM[PP+1].HH.RH;
WHILE QQ>2500 DO BEGIN MEM[QQ].HH.LH:=MEM[QQ].HH.LH+DELTA;
QQ:=MEM[QQ].HH.RH;END;QQ:=MEM[PP+1].HH.LH;
WHILE QQ>1 DO BEGIN MEM[QQ].HH.LH:=MEM[QQ].HH.LH+DELTA;
QQ:=MEM[QQ].HH.RH;END;PP:=MEM[PP].HH.RH;UNTIL PP=H;END{:355};
N:=MEM[CUREDGES+1].HH.LH;P:=MEM[CUREDGES].HH.RH;PP:=MEM[H].HH.RH;
WHILE N<MEM[H+1].HH.LH DO BEGIN N:=N+1;P:=MEM[P].HH.RH;END;REPEAT{356:}
QQ:=MEM[PP+1].HH.LH;
IF QQ>1 THEN IF MEM[P+1].HH.LH<=1 THEN MEM[P+1].HH.LH:=QQ ELSE BEGIN
WHILE MEM[QQ].HH.RH>1 DO QQ:=MEM[QQ].HH.RH;
MEM[QQ].HH.RH:=MEM[P+1].HH.LH;MEM[P+1].HH.LH:=MEM[PP+1].HH.LH;END;
MEM[PP+1].HH.LH:=0;QQ:=MEM[PP+1].HH.RH;
IF QQ<>2500 THEN BEGIN IF MEM[P+1].HH.LH=1 THEN MEM[P+1].HH.LH:=0;
MEM[PP+1].HH.RH:=2500;R:=P+1;Q:=MEM[R].HH.RH;
IF Q=2500 THEN MEM[P+1].HH.RH:=QQ ELSE WHILE TRUE DO BEGIN K:=MEM[QQ].HH
.LH;WHILE K>MEM[Q].HH.LH DO BEGIN R:=Q;Q:=MEM[R].HH.RH;END;
MEM[R].HH.RH:=QQ;RR:=MEM[QQ].HH.RH;MEM[QQ].HH.RH:=Q;
IF RR=2500 THEN GOTO 30;R:=QQ;QQ:=RR;END;END;30:{:356};
PP:=MEM[PP].HH.RH;P:=MEM[P].HH.RH;UNTIL PP=H;END;END;{:354}{358:}
PROCEDURE BEGINEDGETRA;BEGIN PRINTDIAGNOS(391,311);PRINT(392);
PRINTINT(CURWT);PRINTCHAR(41);TRACEX:=-4096;END;PROCEDURE TRACEACORNER;
BEGIN IF FILEOFFSET>MAXPRINTLINE-13 THEN PRINTNL(311);PRINTCHAR(40);
PRINTINT(TRACEX);PRINTCHAR(44);PRINTINT(TRACEYY);PRINTCHAR(41);
TRACEY:=TRACEYY;END;PROCEDURE ENDEDGETRACI;
BEGIN IF TRACEX=-4096 THEN PRINTNL(393)ELSE BEGIN TRACEACORNER;
PRINTCHAR(46);END;ENDDIAGNOSTI(TRUE);END;{:358}{359:}
PROCEDURE TRACENEWEDGE(R:HALFWORD;N:INTEGER);VAR D:INTEGER;W:-3..3;
M,N0,N1:INTEGER;BEGIN D:=0+MEM[R].HH.LH-0;W:=(D MOD 8)-4;
M:=(D DIV 8)-MEM[CUREDGES+3].HH.LH;IF W=CURWT THEN BEGIN N0:=N+1;N1:=N;
END ELSE BEGIN N0:=N;N1:=N+1;END;
IF M<>TRACEX THEN BEGIN IF TRACEX=-4096 THEN BEGIN PRINTNL(311);
TRACEYY:=N0;END ELSE IF TRACEYY<>N0 THEN PRINTCHAR(63)ELSE TRACEACORNER;
TRACEX:=M;TRACEACORNER;END ELSE BEGIN IF N0<>TRACEYY THEN PRINTCHAR(33);
IF((N0<N1)AND(TRACEY>TRACEYY))OR((N0>N1)AND(TRACEY<TRACEYY))THEN
TRACEACORNER;END;TRACEYY:=N1;END;{:359}{360:}
PROCEDURE LINEEDGES(X0,Y0,X1,Y1:SCALED);LABEL 30,31;
VAR M0,N0,M1,N1:INTEGER;DELX,DELY:SCALED;YT:SCALED;TX:SCALED;
P,R:HALFWORD;BASE:INTEGER;N:INTEGER;BEGIN N0:=ROUNDUNSCALE(Y0);
N1:=ROUNDUNSCALE(Y1);IF N0<>N1 THEN BEGIN M0:=ROUNDUNSCALE(X0);
M1:=ROUNDUNSCALE(X1);DELX:=X1-X0;DELY:=Y1-Y0;YT:=N0*65536-32768;
Y0:=Y0-YT;Y1:=Y1-YT;IF N0<N1 THEN{361:}
BEGIN BASE:=8*MEM[CUREDGES+3].HH.LH+4-CURWT;
IF M0<=M1 THEN EDGEPREP(M0,M1,N0,N1)ELSE EDGEPREP(M1,M0,N0,N1);{363:}
N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:363};
Y0:=65536-Y0;WHILE TRUE DO BEGIN R:=GETAVAIL;
MEM[R].HH.RH:=MEM[P+1].HH.LH;MEM[P+1].HH.LH:=R;
TX:=TAKEFRACTION(DELX,MAKEFRACTION(Y0,DELY));
IF ABVSCD(DELX,Y0,DELY,TX)<0 THEN TX:=TX-1;
MEM[R].HH.LH:=8*ROUNDUNSCALE(X0+TX)+BASE;Y1:=Y1-65536;
IF INTERNAL[8]>0 THEN TRACENEWEDGE(R,N);IF Y1<65536 THEN GOTO 30;
P:=MEM[P].HH.RH;Y0:=Y0+65536;N:=N+1;END;30:END{:361}ELSE{362:}
BEGIN BASE:=8*MEM[CUREDGES+3].HH.LH+4+CURWT;
IF M0<=M1 THEN EDGEPREP(M0,M1,N1,N0)ELSE EDGEPREP(M1,M0,N1,N0);N0:=N0-1;
{363:}N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:363};
WHILE TRUE DO BEGIN R:=GETAVAIL;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[P+1].HH.LH:=R;TX:=TAKEFRACTION(DELX,MAKEFRACTION(Y0,DELY));
IF ABVSCD(DELX,Y0,DELY,TX)<0 THEN TX:=TX+1;
MEM[R].HH.LH:=8*ROUNDUNSCALE(X0-TX)+BASE;Y1:=Y1+65536;
IF INTERNAL[8]>0 THEN TRACENEWEDGE(R,N);IF Y1>=0 THEN GOTO 31;
P:=MEM[P].HH.LH;Y0:=Y0+65536;N:=N-1;END;31:END{:362};
MEM[CUREDGES+5].HH.RH:=P;MEM[CUREDGES+5].HH.LH:=N+4096;END;END;{:360}
{364:}PROCEDURE MOVETOEDGES(M0,N0,M1,N1:INTEGER;OCTANT:SMALLNUMBER);
LABEL 60,61,62,63,30;VAR DELTA:0..MOVESIZE;K:0..MOVESIZE;P,R:HALFWORD;
DX:INTEGER;EDGEANDWEIGH:INTEGER;J:INTEGER;N:INTEGER;SUM:INTEGER;
BEGIN DELTA:=N1-N0;SUM:=MOVE[0];
FOR K:=1 TO DELTA DO SUM:=SUM+ABS(MOVE[K]);
IF SUM<>M1-M0 THEN CONFUSION(48);{365:}CASE OCTANT OF 1:BEGIN DX:=8;
EDGEPREP(M0,M1,N0,N1);GOTO 60;END;5:BEGIN DX:=8;EDGEPREP(N0,N1,M0,M1);
GOTO 62;END;6:BEGIN DX:=-8;EDGEPREP(-N1,-N0,M0,M1);N0:=-N0;GOTO 62;END;
2:BEGIN DX:=-8;EDGEPREP(-M1,-M0,N0,N1);M0:=-M0;GOTO 60;END;
4:BEGIN DX:=-8;EDGEPREP(-M1,-M0,-N1,-N0);M0:=-M0;GOTO 61;END;
8:BEGIN DX:=-8;EDGEPREP(-N1,-N0,-M1,-M0);N0:=-N0;GOTO 63;END;
7:BEGIN DX:=8;EDGEPREP(N0,N1,-M1,-M0);GOTO 63;END;3:BEGIN DX:=8;
EDGEPREP(M0,M1,-N1,-N0);GOTO 61;END;END;{:365};60:{366:}{363:}
N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:363};
IF DELTA>0 THEN BEGIN K:=0;
EDGEANDWEIGH:=8*(M0+MEM[CUREDGES+3].HH.LH)+4-CURWT;
REPEAT EDGEANDWEIGH:=EDGEANDWEIGH+DX*MOVE[K];BEGIN R:=AVAIL;
IF R=0 THEN R:=GETAVAIL ELSE BEGIN AVAIL:=MEM[R].HH.RH;MEM[R].HH.RH:=0;
DYNUSED:=DYNUSED+1;END;END;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[R].HH.LH:=EDGEANDWEIGH;IF INTERNAL[8]>0 THEN TRACENEWEDGE(R,N);
MEM[P+1].HH.LH:=R;P:=MEM[P].HH.RH;K:=K+1;N:=N+1;UNTIL K=DELTA;END;
GOTO 30{:366};61:{367:}N0:=-N0-1;{363:}N:=MEM[CUREDGES+5].HH.LH-4096;
P:=MEM[CUREDGES+5].HH.RH;IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;
P:=MEM[P].HH.RH;UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;
UNTIL N=N0{:363};IF DELTA>0 THEN BEGIN K:=0;
EDGEANDWEIGH:=8*(M0+MEM[CUREDGES+3].HH.LH)+4+CURWT;
REPEAT EDGEANDWEIGH:=EDGEANDWEIGH+DX*MOVE[K];BEGIN R:=AVAIL;
IF R=0 THEN R:=GETAVAIL ELSE BEGIN AVAIL:=MEM[R].HH.RH;MEM[R].HH.RH:=0;
DYNUSED:=DYNUSED+1;END;END;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[R].HH.LH:=EDGEANDWEIGH;IF INTERNAL[8]>0 THEN TRACENEWEDGE(R,N);
MEM[P+1].HH.LH:=R;P:=MEM[P].HH.LH;K:=K+1;N:=N-1;UNTIL K=DELTA;END;
GOTO 30{:367};62:{368:}
EDGEANDWEIGH:=8*(N0+MEM[CUREDGES+3].HH.LH)+4-CURWT;N0:=M0;K:=0;{363:}
N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:363};
REPEAT J:=MOVE[K];WHILE J>0 DO BEGIN BEGIN R:=AVAIL;
IF R=0 THEN R:=GETAVAIL ELSE BEGIN AVAIL:=MEM[R].HH.RH;MEM[R].HH.RH:=0;
DYNUSED:=DYNUSED+1;END;END;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[R].HH.LH:=EDGEANDWEIGH;IF INTERNAL[8]>0 THEN TRACENEWEDGE(R,N);
MEM[P+1].HH.LH:=R;P:=MEM[P].HH.RH;J:=J-1;N:=N+1;END;
EDGEANDWEIGH:=EDGEANDWEIGH+DX;K:=K+1;UNTIL K>DELTA;GOTO 30{:368};
63:{369:}EDGEANDWEIGH:=8*(N0+MEM[CUREDGES+3].HH.LH)+4+CURWT;N0:=-M0-1;
K:=0;{363:}N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:363};
REPEAT J:=MOVE[K];WHILE J>0 DO BEGIN BEGIN R:=AVAIL;
IF R=0 THEN R:=GETAVAIL ELSE BEGIN AVAIL:=MEM[R].HH.RH;MEM[R].HH.RH:=0;
DYNUSED:=DYNUSED+1;END;END;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[R].HH.LH:=EDGEANDWEIGH;IF INTERNAL[8]>0 THEN TRACENEWEDGE(R,N);
MEM[P+1].HH.LH:=R;P:=MEM[P].HH.LH;J:=J-1;N:=N-1;END;
EDGEANDWEIGH:=EDGEANDWEIGH+DX;K:=K+1;UNTIL K>DELTA;GOTO 30{:369};
30:MEM[CUREDGES+5].HH.LH:=N+4096;MEM[CUREDGES+5].HH.RH:=P;END;{:364}
{372:}PROCEDURE ROTATE(X,Y:SCALED;OCTANT:SMALLNUMBER);
BEGIN CASE OCTANT OF 1:BEGIN CURX:=X;CURY:=Y;END;5:BEGIN CURX:=Y;
CURY:=X;END;6:BEGIN CURX:=Y;CURY:=-X;END;2:BEGIN CURX:=-X;CURY:=Y;END;
4:BEGIN CURX:=-X;CURY:=-Y;END;8:BEGIN CURX:=-Y;CURY:=-X;END;
7:BEGIN CURX:=-Y;CURY:=X;END;3:BEGIN CURX:=X;CURY:=-Y;END;END;END;{:372}
{375:}FUNCTION CROSSINGPOIN(A,B,C:INTEGER):FRACTION;LABEL 10;
VAR D:INTEGER;X,XX,X0,X1,X2:INTEGER;
BEGIN IF A<0 THEN BEGIN CROSSINGPOIN:=0;GOTO 10;END;
IF C>=0 THEN BEGIN IF B>=0 THEN BEGIN CROSSINGPOIN:=268435457;GOTO 10;
END;IF A=0 THEN BEGIN CROSSINGPOIN:=0;GOTO 10;END;
END ELSE IF A=0 THEN IF B<=0 THEN BEGIN CROSSINGPOIN:=0;GOTO 10;END;
{376:}D:=1;X0:=A;X1:=A-B;X2:=B-C;REPEAT X0:=X0+X0;X:=(X1+X2)DIV 2;
IF X1>X0 THEN BEGIN X2:=X;D:=D+D;END ELSE BEGIN XX:=X1+X;
IF XX>X0 THEN BEGIN X2:=X;D:=D+D;END ELSE BEGIN X0:=X0-XX;
IF X<=X0 THEN IF X+X2<=X0 THEN BEGIN CROSSINGPOIN:=268435457;GOTO 10;
END;X1:=X;D:=D+D+1;END;END;UNTIL D>=268435456;
CROSSINGPOIN:=D-268435456{:376};10:END;{:375}{378:}
PROCEDURE PRINTSPEC(H:HALFWORD;S:STRNUMBER);LABEL 45,30;
VAR P,Q:HALFWORD;OCTANT:SMALLNUMBER;BEGIN PRINTDIAGNOS(394,S);P:=H;
OCTANT:=MEM[P+3].INT;PRINTLN;UNROTATE(MEM[H+1].INT,MEM[H+2].INT,OCTANT);
PRINTTWO(CURX,CURY);PRINT(395);WHILE TRUE DO BEGIN{379:}
CASE OCTANT OF 1:PRINT(398);5:PRINT(399);6:PRINT(400);2:PRINT(401);
4:PRINT(402);8:PRINT(403);7:PRINT(404);3:PRINT(405);END;PRINT(406){:379}
;WHILE TRUE DO BEGIN Q:=MEM[P].HH.RH;IF MEM[P].HH.B1=0 THEN GOTO 45;
{380:}BEGIN PRINTNL(407);UNROTATE(MEM[P+5].INT,MEM[P+6].INT,OCTANT);
PRINTTWO(CURX,CURY);PRINT(377);
UNROTATE(MEM[Q+3].INT,MEM[Q+4].INT,OCTANT);PRINTTWO(CURX,CURY);
PRINTNL(371);UNROTATE(MEM[Q+1].INT,MEM[Q+2].INT,OCTANT);
PRINTTWO(CURX,CURY);PRINT(408);PRINTINT(MEM[Q].HH.B0-1);END{:380};P:=Q;
END;45:IF Q=H THEN GOTO 30;P:=Q;OCTANT:=MEM[P+3].INT;PRINTNL(396);END;
30:PRINTNL(397);ENDDIAGNOSTI(TRUE);END;{:378}{381:}{389:}
PROCEDURE SPLITCUBIC(P:HALFWORD;T:FRACTION);VAR V:SCALED;Q,R:HALFWORD;
BEGIN Q:=MEM[P].HH.RH;R:=GETNODE(7);MEM[P].HH.RH:=R;MEM[R].HH.RH:=Q;
UNROTATE(MEM[Q+1].INT,MEM[Q+2].INT,MEM[Q].HH.B1);
ROTATE(CURX,CURY,MEM[P].HH.B1);MEM[R].HH.B0:=MEM[Q].HH.B0;
MEM[R].HH.B1:=MEM[P].HH.B1;
V:=MEM[P+5].INT-TAKEFRACTION(MEM[P+5].INT-MEM[Q+3].INT,T);
MEM[P+5].INT:=MEM[P+1].INT-TAKEFRACTION(MEM[P+1].INT-MEM[P+5].INT,T);
MEM[Q+3].INT:=MEM[Q+3].INT-TAKEFRACTION(MEM[Q+3].INT-CURX,T);
MEM[R+3].INT:=MEM[P+5].INT-TAKEFRACTION(MEM[P+5].INT-V,T);
MEM[R+5].INT:=V-TAKEFRACTION(V-MEM[Q+3].INT,T);
MEM[R+1].INT:=MEM[R+3].INT-TAKEFRACTION(MEM[R+3].INT-MEM[R+5].INT,T);
V:=MEM[P+6].INT-TAKEFRACTION(MEM[P+6].INT-MEM[Q+4].INT,T);
MEM[P+6].INT:=MEM[P+2].INT-TAKEFRACTION(MEM[P+2].INT-MEM[P+6].INT,T);
MEM[Q+4].INT:=MEM[Q+4].INT-TAKEFRACTION(MEM[Q+4].INT-CURY,T);
MEM[R+4].INT:=MEM[P+6].INT-TAKEFRACTION(MEM[P+6].INT-V,T);
MEM[R+6].INT:=V-TAKEFRACTION(V-MEM[Q+4].INT,T);
MEM[R+2].INT:=MEM[R+4].INT-TAKEFRACTION(MEM[R+4].INT-MEM[R+6].INT,T);
END;{:389}{402:}PROCEDURE REMOVECUBIC(P:HALFWORD);VAR Q:HALFWORD;
BEGIN Q:=MEM[P].HH.RH;MEM[P].HH.B1:=MEM[Q].HH.B1;
MEM[P].HH.RH:=MEM[Q].HH.RH;MEM[P+1].INT:=MEM[Q+1].INT;
MEM[P+2].INT:=MEM[Q+2].INT;MEM[P+5].INT:=MEM[Q+5].INT;
MEM[P+6].INT:=MEM[Q+6].INT;FREENODE(Q,7);END;{:402}{406:}
PROCEDURE NEWBOUNDARY(P:HALFWORD;OCTANT:SMALLNUMBER);VAR Q,R:HALFWORD;
BEGIN Q:=MEM[P].HH.RH;R:=GETNODE(7);MEM[R].HH.RH:=Q;MEM[P].HH.RH:=R;
MEM[R].HH.B0:=MEM[Q].HH.B0;MEM[R+3].INT:=MEM[Q+3].INT;
MEM[R+4].INT:=MEM[Q+4].INT;MEM[R].HH.B1:=0;MEM[Q].HH.B0:=0;
MEM[R+5].INT:=OCTANT;MEM[Q+3].INT:=MEM[Q].HH.B1;
UNROTATE(MEM[Q+1].INT,MEM[Q+2].INT,MEM[Q].HH.B1);
ROTATE(CURX,CURY,OCTANT);MEM[R+1].INT:=CURX;MEM[R+2].INT:=CURY;END;
{:406}FUNCTION MAKESPEC(H:HALFWORD;SAFETYMARGIN:SCALED):HALFWORD;
LABEL 22,30;VAR P,Q,R,S,PP,QQ:HALFWORD;K:INTEGER;CHOPPED:BOOLEAN;
MAXALLOWED:SCALED;XH:SCALED;{386:}DEL1,DEL2,DEL3,DEL,DMAX:SCALED;
T:FRACTION;DESTX,DESTY:SCALED;{:386}{408:}O1,O2:SMALLNUMBER;
CLOCKWISE:BOOLEAN;TURNAROUND:BOOLEAN;DX1,DY1,DX2,DY2:INTEGER;{:408}
BEGIN IF INTERNAL[4]>0 THEN PRINTPATH(H,409);
MAXALLOWED:=268402687-SAFETYMARGIN;{383:}P:=H;K:=1;CHOPPED:=FALSE;
REPEAT IF ABS(MEM[P+3].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+3].INT>0 THEN MEM[P+3].INT:=MAXALLOWED ELSE MEM[P+3].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+4].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+4].INT>0 THEN MEM[P+4].INT:=MAXALLOWED ELSE MEM[P+4].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+1].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+1].INT>0 THEN MEM[P+1].INT:=MAXALLOWED ELSE MEM[P+1].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+2].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+2].INT>0 THEN MEM[P+2].INT:=MAXALLOWED ELSE MEM[P+2].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+5].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+5].INT>0 THEN MEM[P+5].INT:=MAXALLOWED ELSE MEM[P+5].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+6].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+6].INT>0 THEN MEM[P+6].INT:=MAXALLOWED ELSE MEM[P+6].INT:=-
MAXALLOWED;END;P:=MEM[P].HH.RH;MEM[P].HH.B0:=K;K:=K+1;UNTIL P=H;
IF CHOPPED THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(411);END;BEGIN HELPPTR:=4;HELPLINE[3]:=412;
HELPLINE[2]:=413;HELPLINE[1]:=414;HELPLINE[0]:=415;END;ERROR;END{:383};
{384:}P:=H;XH:=MEM[H+1].INT;REPEAT Q:=MEM[P].HH.RH;{385:}
IF Q=H THEN DESTX:=XH ELSE DESTX:=MEM[Q+1].INT;
DEL1:=MEM[P+5].INT-MEM[P+1].INT;DEL2:=MEM[Q+3].INT-MEM[P+5].INT;
DEL3:=DESTX-MEM[Q+3].INT;{387:}
IF DEL1<>0 THEN DEL:=DEL1 ELSE IF DEL2<>0 THEN DEL:=DEL2 ELSE DEL:=DEL3;
IF DEL<>0 THEN BEGIN DMAX:=ABS(DEL1);
IF ABS(DEL2)>DMAX THEN DMAX:=ABS(DEL2);
IF ABS(DEL3)>DMAX THEN DMAX:=ABS(DEL3);
WHILE DMAX<134217728 DO BEGIN DMAX:=DMAX+DMAX;DEL1:=DEL1+DEL1;
DEL2:=DEL2+DEL2;DEL3:=DEL3+DEL3;END;END{:387};
IF DEL<>0 THEN BEGIN IF DEL<0 THEN{388:}
BEGIN MEM[P+1].INT:=-MEM[P+1].INT;MEM[P+5].INT:=-MEM[P+5].INT;
MEM[Q+3].INT:=-MEM[Q+3].INT;DEL1:=-DEL1;DEL2:=-DEL2;DEL3:=-DEL3;
DESTX:=-DESTX;MEM[P].HH.B1:=2;END{:388};T:=CROSSINGPOIN(DEL1,DEL2,DEL3);
IF T<268435456 THEN{390:}BEGIN SPLITCUBIC(P,T);R:=MEM[P].HH.RH;
IF MEM[R].HH.B1>1 THEN MEM[R].HH.B1:=1 ELSE MEM[R].HH.B1:=2;
IF MEM[R+1].INT<MEM[P+1].INT THEN MEM[R+1].INT:=MEM[P+1].INT;
MEM[R+3].INT:=MEM[R+1].INT;MEM[R+1].INT:=-MEM[R+1].INT;
MEM[R+5].INT:=MEM[R+1].INT;MEM[Q+3].INT:=-MEM[Q+3].INT;
DEL2:=DEL2-TAKEFRACTION(DEL2-DEL3,T);IF DEL2>0 THEN DEL2:=0;
T:=CROSSINGPOIN(0,-DEL2,-DEL3);IF T<268435456 THEN{391:}
BEGIN SPLITCUBIC(R,T);S:=MEM[R].HH.RH;
IF MEM[S+1].INT<-DESTX THEN MEM[S+1].INT:=-DESTX;
IF MEM[S+1].INT<MEM[R+1].INT THEN MEM[S+1].INT:=MEM[R+1].INT;
MEM[S].HH.B1:=MEM[P].HH.B1;MEM[S+3].INT:=MEM[S+1].INT;
MEM[S+1].INT:=-MEM[S+1].INT;MEM[S+5].INT:=MEM[S+1].INT;
MEM[Q+3].INT:=-MEM[Q+3].INT;END{:391}
ELSE IF MEM[R+1].INT>-DESTX THEN MEM[R+1].INT:=-DESTX;END{:390};
END{:385};{392:}PP:=P;REPEAT QQ:=MEM[PP].HH.RH;
UNROTATE(MEM[QQ+1].INT,MEM[QQ+2].INT,MEM[QQ].HH.B1);
ROTATE(CURX,CURY,MEM[PP].HH.B1);DESTX:=CURX;DESTY:=CURY;
DEL1:=MEM[PP+6].INT-MEM[PP+2].INT;DEL2:=MEM[QQ+4].INT-MEM[PP+6].INT;
DEL3:=DESTY-MEM[QQ+4].INT;{387:}
IF DEL1<>0 THEN DEL:=DEL1 ELSE IF DEL2<>0 THEN DEL:=DEL2 ELSE DEL:=DEL3;
IF DEL<>0 THEN BEGIN DMAX:=ABS(DEL1);
IF ABS(DEL2)>DMAX THEN DMAX:=ABS(DEL2);
IF ABS(DEL3)>DMAX THEN DMAX:=ABS(DEL3);
WHILE DMAX<134217728 DO BEGIN DMAX:=DMAX+DMAX;DEL1:=DEL1+DEL1;
DEL2:=DEL2+DEL2;DEL3:=DEL3+DEL3;END;END{:387};
IF DEL<>0 THEN BEGIN IF DEL<0 THEN{393:}
BEGIN MEM[PP+2].INT:=-MEM[PP+2].INT;MEM[PP+6].INT:=-MEM[PP+6].INT;
MEM[QQ+4].INT:=-MEM[QQ+4].INT;DEL1:=-DEL1;DEL2:=-DEL2;DEL3:=-DEL3;
DESTY:=-DESTY;MEM[PP].HH.B1:=MEM[PP].HH.B1+2;END{:393};
T:=CROSSINGPOIN(DEL1,DEL2,DEL3);IF T<268435456 THEN{394:}
BEGIN SPLITCUBIC(PP,T);R:=MEM[PP].HH.RH;
IF MEM[R].HH.B1>2 THEN MEM[R].HH.B1:=MEM[R].HH.B1-2 ELSE MEM[R].HH.B1:=
MEM[R].HH.B1+2;
IF MEM[R+1].INT>DESTX THEN MEM[R+1].INT:=DESTX ELSE IF MEM[R+1].INT<MEM[
PP+1].INT THEN MEM[R+1].INT:=MEM[PP+1].INT;
IF MEM[R+2].INT<MEM[PP+2].INT THEN MEM[R+2].INT:=MEM[PP+2].INT;
MEM[R+4].INT:=MEM[R+2].INT;MEM[R+2].INT:=-MEM[R+2].INT;
MEM[R+6].INT:=MEM[R+2].INT;MEM[QQ+4].INT:=-MEM[QQ+4].INT;
DEL2:=DEL2-TAKEFRACTION(DEL2-DEL3,T);IF DEL2>0 THEN DEL2:=0;
T:=CROSSINGPOIN(0,-DEL2,-DEL3);IF T<268435456 THEN{395:}
BEGIN SPLITCUBIC(R,T);S:=MEM[R].HH.RH;
IF MEM[S+1].INT>DESTX THEN MEM[S+1].INT:=DESTX ELSE IF MEM[S+1].INT<MEM[
R+1].INT THEN MEM[S+1].INT:=MEM[R+1].INT;
IF MEM[S+2].INT<-DESTY THEN MEM[S+2].INT:=-DESTY;
IF MEM[S+2].INT<MEM[R+2].INT THEN MEM[S+2].INT:=MEM[R+2].INT;
MEM[S].HH.B1:=MEM[PP].HH.B1;MEM[S+4].INT:=MEM[S+2].INT;
MEM[S+2].INT:=-MEM[S+2].INT;MEM[S+6].INT:=MEM[S+2].INT;
MEM[QQ+4].INT:=-MEM[QQ+4].INT;END{:395}
ELSE IF MEM[R+2].INT>-DESTY THEN MEM[R+2].INT:=-DESTY;END{:394};END;
PP:=QQ;UNTIL PP=Q{:392};{396:}PP:=P;REPEAT QQ:=MEM[PP].HH.RH;{397:}
UNROTATE(MEM[QQ+1].INT,MEM[QQ+2].INT,MEM[QQ].HH.B1);
ROTATE(CURX,CURY,MEM[PP].HH.B1);DESTX:=CURX;DESTY:=CURY;
DEL1:=MEM[PP+5].INT-MEM[PP+6].INT;DEL2:=MEM[QQ+3].INT-MEM[QQ+4].INT;
DEL3:=DESTX-DESTY-DEL2;DEL2:=DEL2-DEL1;
DEL1:=DEL1-(MEM[PP+1].INT-MEM[PP+2].INT){:397};{387:}
IF DEL1<>0 THEN DEL:=DEL1 ELSE IF DEL2<>0 THEN DEL:=DEL2 ELSE DEL:=DEL3;
IF DEL<>0 THEN BEGIN DMAX:=ABS(DEL1);
IF ABS(DEL2)>DMAX THEN DMAX:=ABS(DEL2);
IF ABS(DEL3)>DMAX THEN DMAX:=ABS(DEL3);
WHILE DMAX<134217728 DO BEGIN DMAX:=DMAX+DMAX;DEL1:=DEL1+DEL1;
DEL2:=DEL2+DEL2;DEL3:=DEL3+DEL3;END;END{:387};
IF DEL<>0 THEN BEGIN IF DEL<0 THEN{398:}BEGIN DEL:=MEM[PP+2].INT;
MEM[PP+2].INT:=MEM[PP+1].INT;MEM[PP+1].INT:=DEL;DEL:=MEM[PP+6].INT;
MEM[PP+6].INT:=MEM[PP+5].INT;MEM[PP+5].INT:=DEL;DEL:=MEM[QQ+4].INT;
MEM[QQ+4].INT:=MEM[QQ+3].INT;MEM[QQ+3].INT:=DEL;DEL1:=-DEL1;DEL2:=-DEL2;
DEL3:=-DEL3;DEL:=DESTX;DESTX:=DESTY;DESTY:=DEL;
MEM[PP].HH.B1:=MEM[PP].HH.B1+4;END{:398};
T:=CROSSINGPOIN(DEL1,DEL2,DEL3);IF T<268435456 THEN{399:}
BEGIN SPLITCUBIC(PP,T);R:=MEM[PP].HH.RH;
IF MEM[R].HH.B1>4 THEN MEM[R].HH.B1:=MEM[R].HH.B1-4 ELSE MEM[R].HH.B1:=
MEM[R].HH.B1+4;
IF MEM[R+2].INT>DESTY THEN MEM[R+2].INT:=DESTY ELSE IF MEM[R+2].INT<MEM[
PP+2].INT THEN MEM[R+2].INT:=MEM[PP+2].INT;
IF MEM[R+1].INT-MEM[R+2].INT<MEM[PP+1].INT-MEM[PP+2].INT THEN MEM[R+1].
INT:=MEM[PP+1].INT-MEM[PP+2].INT+MEM[R+2].INT;
MEM[R+4].INT:=MEM[R+2].INT-(MEM[R+1].INT-MEM[R+3].INT);
DEL:=MEM[R+2].INT;MEM[R+2].INT:=MEM[R+1].INT;MEM[R+1].INT:=DEL;
MEM[R+6].INT:=MEM[R+5].INT;
MEM[R+5].INT:=MEM[R+1].INT+MEM[R+6].INT-MEM[R+2].INT;DEL:=MEM[QQ+4].INT;
MEM[QQ+4].INT:=MEM[QQ+3].INT;MEM[QQ+3].INT:=DEL;
DEL2:=DEL2-TAKEFRACTION(DEL2-DEL3,T);IF DEL2>0 THEN DEL2:=0;
T:=CROSSINGPOIN(0,-DEL2,-DEL3);IF T<268435456 THEN{400:}
BEGIN SPLITCUBIC(R,T);S:=MEM[R].HH.RH;MEM[S].HH.B1:=MEM[PP].HH.B1;
IF MEM[S+2].INT>DESTX THEN MEM[S+2].INT:=DESTX ELSE IF MEM[S+2].INT<MEM[
R+2].INT THEN MEM[S+2].INT:=MEM[R+2].INT;
IF MEM[S+1].INT-MEM[S+2].INT<DESTY-DESTX THEN MEM[S+1].INT:=MEM[S+2].INT
+DESTY-DESTX;
IF MEM[S+1].INT-MEM[S+2].INT<MEM[R+1].INT-MEM[R+2].INT THEN MEM[S+1].INT
:=MEM[R+1].INT-MEM[R+2].INT+MEM[S+2].INT;
MEM[S+4].INT:=MEM[S+2].INT-(MEM[S+1].INT-MEM[S+3].INT);
DEL:=MEM[S+2].INT;MEM[S+2].INT:=MEM[S+1].INT;MEM[S+1].INT:=DEL;
MEM[S+6].INT:=MEM[S+5].INT;
MEM[S+5].INT:=MEM[S+1].INT+MEM[S+6].INT-MEM[S+2].INT;DEL:=MEM[QQ+4].INT;
MEM[QQ+4].INT:=MEM[QQ+3].INT;MEM[QQ+3].INT:=DEL;END{:400}
ELSE IF MEM[R+2].INT-MEM[R+1].INT<DESTX-DESTY THEN MEM[R+2].INT:=DESTX-
DESTY+MEM[R+1].INT;END{:399};END;PP:=QQ;UNTIL PP=Q{:396};P:=Q;
UNTIL P=H{:384};{401:}P:=H;REPEAT 22:Q:=MEM[P].HH.RH;
IF(P<>H)OR(Q<>H)THEN BEGIN IF MEM[P+1].INT=MEM[P+5].INT THEN IF MEM[P+2]
.INT=MEM[P+6].INT THEN IF MEM[P+1].INT=MEM[Q+3].INT THEN IF MEM[P+2].INT
=MEM[Q+4].INT THEN BEGIN UNROTATE(MEM[Q+1].INT,MEM[Q+2].INT,MEM[Q].HH.B1
);ROTATE(CURX,CURY,MEM[P].HH.B1);
IF MEM[P+1].INT=CURX THEN IF MEM[P+2].INT=CURY THEN BEGIN REMOVECUBIC(P)
;IF Q<>H THEN GOTO 22 ELSE BEGIN H:=P;Q:=P;END;END;END;END;P:=Q;
UNTIL P=H;{:401};{405:}WINDINGNUMBE:=0;P:=H;Q:=MEM[P].HH.RH;
REPEAT R:=MEM[Q].HH.RH;IF(MEM[P].HH.B1<>MEM[Q].HH.B1)OR(Q=R)THEN{407:}
BEGIN NEWBOUNDARY(P,MEM[P].HH.B1);S:=MEM[P].HH.RH;TURNAROUND:=FALSE;
O1:=OCTANTNUMBER[MEM[P].HH.B1];O2:=OCTANTNUMBER[MEM[Q].HH.B1];
CASE O2-O1 OF 1,-7,7,-1:GOTO 30;0,2,-6:CLOCKWISE:=FALSE;
3,-5,4,-4,5,-3:{409:}BEGIN{410:}DX1:=MEM[S+1].INT-MEM[S+3].INT;
DY1:=MEM[S+2].INT-MEM[S+4].INT;
IF DX1=0 THEN IF DY1=0 THEN BEGIN DX1:=MEM[S+1].INT-MEM[P+5].INT;
DY1:=MEM[S+2].INT-MEM[P+6].INT;
IF DX1=0 THEN IF DY1=0 THEN BEGIN DX1:=MEM[S+1].INT-MEM[P+1].INT;
DY1:=MEM[S+2].INT-MEM[P+2].INT;END;END;DMAX:=ABS(DX1);
IF ABS(DY1)>DMAX THEN DMAX:=ABS(DY1);
WHILE DMAX<268435456 DO BEGIN DMAX:=DMAX+DMAX;DX1:=DX1+DX1;DY1:=DY1+DY1;
END;DX2:=MEM[Q+5].INT-MEM[Q+1].INT;DY2:=MEM[Q+6].INT-MEM[Q+2].INT;
IF DX2=0 THEN IF DY2=0 THEN BEGIN DX2:=MEM[R+3].INT-MEM[Q+1].INT;
DY2:=MEM[R+4].INT-MEM[Q+2].INT;
IF DX2=0 THEN IF DY2=0 THEN BEGIN UNROTATE(MEM[R+1].INT,MEM[R+2].INT,MEM
[R].HH.B1);ROTATE(CURX,CURY,MEM[Q].HH.B1);DX2:=CURX-MEM[Q+1].INT;
DY2:=CURY-MEM[Q+2].INT;END;END;DMAX:=ABS(DX2);
IF ABS(DY2)>DMAX THEN DMAX:=ABS(DY2);
WHILE DMAX<268435456 DO BEGIN DMAX:=DMAX+DMAX;DX2:=DX2+DX2;DY2:=DY2+DY2;
END{:410};UNROTATE(DX1,DY1,MEM[P].HH.B1);DEL:=PYTHADD(CURX,CURY);
DX1:=MAKEFRACTION(CURX,DEL);DY1:=MAKEFRACTION(CURY,DEL);
UNROTATE(DX2,DY2,MEM[Q].HH.B1);DEL:=PYTHADD(CURX,CURY);
DX2:=MAKEFRACTION(CURX,DEL);DY2:=MAKEFRACTION(CURY,DEL);
DEL:=TAKEFRACTION(DX1,DY2)-TAKEFRACTION(DX2,DY1);
IF DEL>4684844 THEN CLOCKWISE:=FALSE ELSE IF DEL<-4684844 THEN CLOCKWISE
:=TRUE ELSE BEGIN CLOCKWISE:=FALSE;TURNAROUND:=TRUE;END;END{:409};
6,-2:CLOCKWISE:=TRUE;END;{411:}
WHILE TRUE DO BEGIN IF CLOCKWISE THEN IF O1=1 THEN O1:=8 ELSE O1:=O1-1
ELSE IF O1=8 THEN O1:=1 ELSE O1:=O1+1;IF O1=O2 THEN GOTO 30;
NEWBOUNDARY(S,OCTANTCODE[O1]);S:=MEM[S].HH.RH;
MEM[S+3].INT:=MEM[S+5].INT;END{:411};
30:IF Q=R THEN BEGIN Q:=MEM[Q].HH.RH;R:=Q;P:=S;MEM[S].HH.RH:=Q;
MEM[Q+3].INT:=MEM[Q+5].INT;MEM[Q].HH.B0:=0;FREENODE(H,7);H:=Q;END;{412:}
P:=MEM[P].HH.RH;REPEAT S:=MEM[P].HH.RH;O1:=OCTANTNUMBER[MEM[P+5].INT];
O2:=OCTANTNUMBER[MEM[S+3].INT];
IF ABS(O1-O2)=1 THEN BEGIN WINDINGNUMBE:=WINDINGNUMBE+O2-O1;
IF O2<O1 THEN O2:=O1;
IF ODD(O2)THEN MEM[P+6].INT:=0 ELSE MEM[P+6].INT:=2;
END ELSE BEGIN IF O1=8 THEN WINDINGNUMBE:=WINDINGNUMBE+1 ELSE
WINDINGNUMBE:=WINDINGNUMBE-1;MEM[P+6].INT:=0;END;
MEM[S+4].INT:=MEM[P+6].INT;{413:}
BEGIN IF MEM[P].HH.B0<>0 THEN IF TURNAROUND OR((MEM[P+6].INT=0)AND(ABS(
MEM[P+4].INT-MEM[P+2].INT)>1))OR((MEM[P+6].INT=2)AND(ABS(MEM[P+3].INT-
MEM[P+4].INT-MEM[P+1].INT+MEM[P+2].INT)>1))THEN MEM[P+6].INT:=MEM[P+6].
INT+1;
IF MEM[S].HH.B1<>0 THEN IF TURNAROUND OR((MEM[S+4].INT=0)AND(ABS(MEM[S+6
].INT-MEM[S+2].INT)>1))OR((MEM[S+4].INT=2)AND(ABS(MEM[S+5].INT-MEM[S+6].
INT-MEM[S+1].INT+MEM[S+2].INT)>1))THEN MEM[S+4].INT:=MEM[S+4].INT+1;
END{:413};P:=S;UNTIL P=Q{:412};END{:407};P:=Q;Q:=R;UNTIL P=H;{:405};
WHILE MEM[H].HH.B0<>0 DO H:=MEM[H].HH.RH;
IF INTERNAL[4]>0 THEN PRINTSPEC(H,410);MAKESPEC:=H;END;{:381}{418:}
FUNCTION SKEW(P,Q:HALFWORD;XX0,YY0,XX1,YY1:SCALED):BOOLEAN;
VAR LAMBDA,MU:FRACTION;REASONABLE:BOOLEAN;
LAMBDANUM,LAMBDADENOM,MUNUM,MUDENOM,ALPHA,BETA:SCALED;BEGIN{419:}
MUNUM:=YY1-YY0;MUDENOM:=MEM[Q+2].INT-MEM[P+2].INT;LAMBDANUM:=XX1-XX0;
LAMBDADENOM:=MEM[Q+1].INT-MEM[P+1].INT-MUDENOM;
IF(LAMBDANUM<0)OR(MUNUM<0)OR((LAMBDANUM)DIV 2>=LAMBDADENOM)OR((MUNUM)DIV
2>=MUDENOM)THEN BEGIN LAMBDA:=268435456;MU:=268435456;ALPHA:=0;
BETA:=32768;REASONABLE:=FALSE;XX0:=MEM[P+1].INT-MEM[P+2].INT;
YY0:=MEM[P+2].INT+32768;
END ELSE BEGIN LAMBDA:=MAKEFRACTION(LAMBDANUM,LAMBDADENOM);
MU:=MAKEFRACTION(MUNUM,MUDENOM);
ALPHA:=XX0-TAKEFRACTION(MEM[P+1].INT-MEM[P+2].INT,LAMBDA);
BETA:=YY0-TAKEFRACTION(MEM[P+2].INT,MU);REASONABLE:=TRUE;END;{:419};
MEM[P+1].INT:=XX0;MEM[P+2].INT:=YY0;
WHILE P<>Q DO BEGIN MEM[P+5].INT:=TAKEFRACTION(MEM[P+5].INT-MEM[P+6].INT
,LAMBDA)+ALPHA;MEM[P+6].INT:=TAKEFRACTION(MEM[P+6].INT,MU)+BETA;
P:=MEM[P].HH.RH;
MEM[P+3].INT:=TAKEFRACTION(MEM[P+3].INT-MEM[P+4].INT,LAMBDA)+ALPHA;
MEM[P+4].INT:=TAKEFRACTION(MEM[P+4].INT,MU)+BETA;
MEM[P+1].INT:=TAKEFRACTION(MEM[P+1].INT-MEM[P+2].INT,LAMBDA)+ALPHA;
MEM[P+2].INT:=TAKEFRACTION(MEM[P+2].INT,MU)+BETA;END;SKEW:=REASONABLE;
END;{:418}{420:}PROCEDURE MAKEGOOD(X,Y:SCALED;TRANSITION:SMALLNUMBER;
INCOMING:BOOLEAN);VAR THETA,PHI,AVE:SCALED;XX,YY:SCALED;
BEGIN XX:=X+32768-XCORR[OCTANT];CURM:=FLOORUNSCALE(XX);CURX:=CURM*65536;
THETA:=XX-CURX;YY:=Y+32768-YCORR[OCTANT];CURN:=FLOORUNSCALE(YY);
CURY:=CURN*65536;PHI:=YY-CURY;
IF THETA>=PHI+GOOD1[OCTANT]THEN CURDD:=1 ELSE CURDD:=0;
IF TRANSITION=0 THEN BEGIN CURX:=X;
IF INTERNAL[30]>0 THEN IF THETA>=GOOD2[OCTANT]THEN CURD:=1 ELSE CURD:=0
ELSE BEGIN CURY:=Y;CURD:=CURDD;END;
END ELSE IF ODD(TRANSITION)OR(INTERNAL[30]<=65536)THEN BEGIN CURX:=X;
CURY:=Y;CURD:=CURDD;END ELSE{421:}
BEGIN AVE:=(THETA+PHI+GOOD3[OCTANT])DIV 2;
IF AVE<16385 THEN AVE:=16385 ELSE IF AVE>49151 THEN AVE:=49151;
IF INCOMING THEN PHI:=PHI+1;IF THETA<PHI THEN BEGIN THETA:=AVE-49152;
PHI:=AVE-16384;CURD:=0;END ELSE BEGIN THETA:=AVE-16384;PHI:=AVE-49152;
CURD:=1;END;CURX:=CURX+THETA;CURY:=CURY+PHI;END{:421};END;{:420}{424:}
PROCEDURE FILLSPEC(H:HALFWORD);VAR P,Q,R,S:HALFWORD;M0,N0,M1,N1:INTEGER;
XX0,YY0:SCALED;D0,DD0,D1:0..1;BEGIN IF INTERNAL[8]>0 THEN BEGINEDGETRA;
P:=H;REPEAT OCTANT:=MEM[P+3].INT;{425:}Q:=P;
WHILE MEM[Q].HH.B1<>0 DO Q:=MEM[Q].HH.RH{:425};IF Q<>P THEN BEGIN{426:}
MAKEGOOD(MEM[P+1].INT,MEM[P+2].INT,MEM[P+4].INT,TRUE);M0:=CURM;N0:=CURN;
D0:=CURD;DD0:=CURDD;XX0:=CURX-CURY;YY0:=CURY+32768;
MAKEGOOD(MEM[Q+1].INT,MEM[Q+2].INT,MEM[Q+6].INT,FALSE);M1:=CURM;
N1:=CURN;
IF SKEW(P,Q,XX0,YY0,CURX-CURY,CURY+32768)THEN D1:=CURD ELSE BEGIN D1:=
CURDD;D0:=DD0;END{:426};{427:}
IF N1-N0>=MOVESIZE THEN OVERFLOW(390,MOVESIZE);MOVE[0]:=D0;MOVEPTR:=0;
R:=P;REPEAT S:=MEM[R].HH.RH;
MAKEMOVES(MEM[R+1].INT,MEM[R+5].INT,MEM[S+3].INT,MEM[S+1].INT,MEM[R+2].
INT,MEM[R+6].INT,MEM[S+4].INT,MEM[S+2].INT,XYCORR[OCTANT],YCORR[OCTANT])
;R:=S;UNTIL R=Q;MOVE[MOVEPTR]:=MOVE[MOVEPTR]-D1;
IF INTERNAL[29]>0 THEN SMOOTHMOVES(0,MOVEPTR){:427};
MOVETOEDGES(M0,N0,M1,N1,OCTANT);END;P:=MEM[Q].HH.RH;UNTIL P=H;
TOSSKNOTLIST(H);IF INTERNAL[8]>0 THEN ENDEDGETRACI;END;{:424}{435:}
PROCEDURE DUPOFFSET(W:HALFWORD);VAR R:HALFWORD;BEGIN R:=GETNODE(3);
MEM[R+1].INT:=MEM[W+1].INT;MEM[R+2].INT:=MEM[W+2].INT;
MEM[R].HH.RH:=MEM[W].HH.RH;MEM[MEM[W].HH.RH].HH.LH:=R;MEM[R].HH.LH:=W;
MEM[W].HH.RH:=R;END;{:435}{436:}FUNCTION MAKEPEN(H:HALFWORD):HALFWORD;
LABEL 30,31,45,40;VAR O,OO,K:SMALLNUMBER;P:HALFWORD;
Q,R,S,W,WW,HH:HALFWORD;N:INTEGER;DX,DY:SCALED;MC:SCALED;BEGIN{438:}Q:=H;
R:=MEM[Q].HH.RH;MC:=ABS(MEM[H+1].INT);IF Q=R THEN BEGIN HH:=H;
MEM[H].HH.B1:=0;IF MC<ABS(MEM[H+2].INT)THEN MC:=ABS(MEM[H+2].INT);
END ELSE BEGIN O:=0;HH:=0;WHILE TRUE DO BEGIN S:=MEM[R].HH.RH;
IF MC<ABS(MEM[R+1].INT)THEN MC:=ABS(MEM[R+1].INT);
IF MC<ABS(MEM[R+2].INT)THEN MC:=ABS(MEM[R+2].INT);
DX:=MEM[R+1].INT-MEM[Q+1].INT;DY:=MEM[R+2].INT-MEM[Q+2].INT;
IF DX=0 THEN IF DY=0 THEN GOTO 45;
IF ABVSCD(DX,MEM[S+2].INT-MEM[R+2].INT,DY,MEM[S+1].INT-MEM[R+1].INT)<0
THEN GOTO 45;{439:}
IF DX>0 THEN OCTANT:=1 ELSE IF DX=0 THEN IF DY>0 THEN OCTANT:=1 ELSE
OCTANT:=2 ELSE BEGIN DX:=-DX;OCTANT:=2;END;IF DY<0 THEN BEGIN DY:=-DY;
OCTANT:=OCTANT+2;END ELSE IF DY=0 THEN IF OCTANT>1 THEN OCTANT:=4;
IF DX<DY THEN OCTANT:=OCTANT+4{:439};MEM[Q].HH.B1:=OCTANT;
OO:=OCTANTNUMBER[OCTANT];IF O>OO THEN BEGIN IF HH<>0 THEN GOTO 45;HH:=Q;
END;O:=OO;IF(Q=H)AND(HH<>0)THEN GOTO 30;Q:=R;R:=S;END;30:END{:438};
IF MC>=134184960 THEN GOTO 45;P:=GETNODE(10);Q:=HH;MEM[P+9].INT:=MC;
MEM[P].HH.LH:=0;FOR K:=1 TO 8 DO{440:}BEGIN OCTANT:=OCTANTCODE[K];N:=0;
H:=P+OCTANT;WHILE TRUE DO BEGIN R:=GETNODE(3);{441:}
CASE OCTANT OF 1:BEGIN MEM[R+1].INT:=MEM[Q+1].INT-(MEM[Q+2].INT);
MEM[R+2].INT:=MEM[Q+2].INT;END;
5:BEGIN MEM[R+1].INT:=MEM[Q+2].INT-(MEM[Q+1].INT);
MEM[R+2].INT:=MEM[Q+1].INT;END;
6:BEGIN MEM[R+1].INT:=MEM[Q+2].INT-(-MEM[Q+1].INT);
MEM[R+2].INT:=-MEM[Q+1].INT;END;
2:BEGIN MEM[R+1].INT:=-MEM[Q+1].INT-(MEM[Q+2].INT);
MEM[R+2].INT:=MEM[Q+2].INT;END;
4:BEGIN MEM[R+1].INT:=-MEM[Q+1].INT-(-MEM[Q+2].INT);
MEM[R+2].INT:=-MEM[Q+2].INT;END;
8:BEGIN MEM[R+1].INT:=-MEM[Q+2].INT-(-MEM[Q+1].INT);
MEM[R+2].INT:=-MEM[Q+1].INT;END;
7:BEGIN MEM[R+1].INT:=-MEM[Q+2].INT-(MEM[Q+1].INT);
MEM[R+2].INT:=MEM[Q+1].INT;END;
3:BEGIN MEM[R+1].INT:=MEM[Q+1].INT-(-MEM[Q+2].INT);
MEM[R+2].INT:=-MEM[Q+2].INT;END;END{:441};
IF N=0 THEN MEM[H].HH.RH:=R ELSE{442:}
IF ODD(K)THEN BEGIN MEM[W].HH.RH:=R;MEM[R].HH.LH:=W;
END ELSE BEGIN MEM[W].HH.LH:=R;MEM[R].HH.RH:=W;END{:442};W:=R;
IF MEM[Q].HH.B1<>OCTANT THEN GOTO 31;Q:=MEM[Q].HH.RH;N:=N+1;END;
31:{443:}R:=MEM[H].HH.RH;IF ODD(K)THEN BEGIN MEM[W].HH.RH:=R;
MEM[R].HH.LH:=W;END ELSE BEGIN MEM[W].HH.LH:=R;MEM[R].HH.RH:=W;
MEM[H].HH.RH:=W;R:=W;END;
IF(MEM[R+2].INT<>MEM[MEM[R].HH.RH+2].INT)OR(N=0)THEN BEGIN DUPOFFSET(R);
N:=N+1;END;R:=MEM[R].HH.LH;
IF MEM[R+1].INT<>MEM[MEM[R].HH.LH+1].INT THEN DUPOFFSET(R)ELSE N:=N-1{:
443};MEM[H].HH.LH:=N;END{:440};GOTO 40;45:P:=3;{437:}
IF MC>=134184960 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(420);END;BEGIN HELPPTR:=2;HELPLINE[1]:=421;
HELPLINE[0]:=422;END;
END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(423);END;BEGIN HELPPTR:=3;HELPLINE[2]:=424;HELPLINE[1]:=425;
HELPLINE[0]:=422;END;END;ERROR{:437};
40:IF INTERNAL[5]>0 THEN PRINTPEN(P,419);MAKEPEN:=P;END;{:436}{445:}
PROCEDURE FINDOFFSET(X,Y:SCALED;P:HALFWORD);LABEL 30,10;VAR OCTANT:1..8;
S:-1..+1;N:INTEGER;H,W,WW:HALFWORD;BEGIN{446:}
IF X>0 THEN OCTANT:=1 ELSE IF X=0 THEN IF Y<=0 THEN IF Y=0 THEN BEGIN
CURX:=0;CURY:=0;GOTO 10;
END ELSE OCTANT:=2 ELSE OCTANT:=1 ELSE BEGIN X:=-X;
IF Y=0 THEN OCTANT:=4 ELSE OCTANT:=2;END;
IF Y<0 THEN BEGIN OCTANT:=OCTANT+2;Y:=-Y;END;
IF X>=Y THEN X:=X-Y ELSE BEGIN OCTANT:=OCTANT+4;X:=Y-X;Y:=Y-X;END{:446};
IF ODD(OCTANTNUMBER[OCTANT])THEN S:=-1 ELSE S:=+1;H:=P+OCTANT;
W:=MEM[MEM[H].HH.RH].HH.RH;WW:=MEM[W].HH.RH;N:=MEM[H].HH.LH;
WHILE N>1 DO BEGIN IF ABVSCD(X,MEM[WW+2].INT-MEM[W+2].INT,Y,MEM[WW+1].
INT-MEM[W+1].INT)<>S THEN GOTO 30;W:=WW;WW:=MEM[W].HH.RH;N:=N-1;END;
30:UNROTATE(MEM[W+1].INT+MEM[W+2].INT,MEM[W+2].INT,OCTANT);10:END;{:445}
{448:}{450:}PROCEDURE SPLITFOROFFS(P:HALFWORD;T:FRACTION);
VAR Q:HALFWORD;R:HALFWORD;S:QUARTERWORD;BEGIN Q:=MEM[P].HH.RH;
S:=MEM[Q].HH.B1;MEM[Q].HH.B1:=1;MEM[P].HH.B1:=1;SPLITCUBIC(P,T);
MEM[Q].HH.B1:=S;R:=MEM[P].HH.RH;
IF MEM[R+2].INT<MEM[P+2].INT THEN MEM[R+2].INT:=MEM[P+2].INT ELSE IF MEM
[R+2].INT>MEM[Q+2].INT THEN MEM[R+2].INT:=MEM[Q+2].INT;
IF MEM[R+1].INT<MEM[P+1].INT THEN MEM[R+1].INT:=MEM[P+1].INT ELSE IF MEM
[R+1].INT>MEM[Q+1].INT THEN MEM[R+1].INT:=MEM[Q+1].INT;END;{:450}{454:}
PROCEDURE FINOFFSETPRE(P:HALFWORD;K:HALFWORD;W:HALFWORD;
X0,X1,X2,Y0,Y1,Y2:INTEGER;RISING:BOOLEAN;N:INTEGER);LABEL 10;
VAR Q,WW:HALFWORD;DU,DV:SCALED;T0,T1,T2:INTEGER;T:FRACTION;S:FRACTION;
V:INTEGER;BEGIN WHILE TRUE DO BEGIN Q:=MEM[P].HH.RH;MEM[P].HH.B1:=K;
IF RISING THEN IF K=N THEN GOTO 10 ELSE WW:=MEM[W].HH.RH ELSE IF K=1
THEN GOTO 10 ELSE WW:=MEM[W].HH.LH;{455:}DU:=MEM[WW+1].INT-MEM[W+1].INT;
DV:=MEM[WW+2].INT-MEM[W+2].INT;
IF ABS(DU)>=ABS(DV)THEN BEGIN S:=MAKEFRACTION(DV,DU);
T0:=TAKEFRACTION(X0,S)-Y0;T1:=TAKEFRACTION(X1,S)-Y1;
T2:=TAKEFRACTION(X2,S)-Y2;END ELSE BEGIN S:=MAKEFRACTION(DU,DV);
T0:=X0-TAKEFRACTION(Y0,S);T1:=X1-TAKEFRACTION(Y1,S);
T2:=X2-TAKEFRACTION(Y2,S);END{:455};T:=CROSSINGPOIN(T0,T1,T2);
IF T>=268435456 THEN GOTO 10;{456:}BEGIN SPLITFOROFFS(P,T);
MEM[P].HH.B1:=K;P:=MEM[P].HH.RH;V:=X0-TAKEFRACTION(X0-X1,T);
X1:=X1-TAKEFRACTION(X1-X2,T);X0:=V-TAKEFRACTION(V-X1,T);
V:=Y0-TAKEFRACTION(Y0-Y1,T);Y1:=Y1-TAKEFRACTION(Y1-Y2,T);
Y0:=V-TAKEFRACTION(V-Y1,T);T1:=T1-TAKEFRACTION(T1-T2,T);
IF T1>0 THEN T1:=0;T:=CROSSINGPOIN(0,-T1,-T2);
IF T<268435456 THEN BEGIN SPLITFOROFFS(P,T);MEM[MEM[P].HH.RH].HH.B1:=K;
V:=X1-TAKEFRACTION(X1-X2,T);X1:=X0-TAKEFRACTION(X0-X1,T);
X2:=X1-TAKEFRACTION(X1-V,T);V:=Y1-TAKEFRACTION(Y1-Y2,T);
Y1:=Y0-TAKEFRACTION(Y0-Y1,T);Y2:=Y1-TAKEFRACTION(Y1-V,T);END;END{:456};
IF RISING THEN K:=K+1 ELSE K:=K-1;W:=WW;END;10:END;{:454}
PROCEDURE OFFSETPREP(C,H:HALFWORD);LABEL 30;VAR N:HALFWORD;
P,Q,R,LH,WW:HALFWORD;K:HALFWORD;W:HALFWORD;{452:}
X0,X1,X2,Y0,Y1,Y2:INTEGER;T0,T1,T2:INTEGER;DU,DV,DX,DY:INTEGER;
MAXCOEF:INTEGER;X0A,X1A,X2A,Y0A,Y1A,Y2A:INTEGER;T:FRACTION;S:FRACTION;
{:452}BEGIN P:=C;N:=MEM[H].HH.LH;LH:=MEM[H].HH.RH;
WHILE MEM[P].HH.B1<>0 DO BEGIN Q:=MEM[P].HH.RH;{451:}
IF N<=1 THEN MEM[P].HH.B1:=1 ELSE BEGIN{453:}
X0:=MEM[P+5].INT-MEM[P+1].INT;X2:=MEM[Q+1].INT-MEM[Q+3].INT;
X1:=MEM[Q+3].INT-MEM[P+5].INT;Y0:=MEM[P+6].INT-MEM[P+2].INT;
Y2:=MEM[Q+2].INT-MEM[Q+4].INT;Y1:=MEM[Q+4].INT-MEM[P+6].INT;
MAXCOEF:=ABS(X0);IF ABS(X1)>MAXCOEF THEN MAXCOEF:=ABS(X1);
IF ABS(X2)>MAXCOEF THEN MAXCOEF:=ABS(X2);
IF ABS(Y0)>MAXCOEF THEN MAXCOEF:=ABS(Y0);
IF ABS(Y1)>MAXCOEF THEN MAXCOEF:=ABS(Y1);
IF ABS(Y2)>MAXCOEF THEN MAXCOEF:=ABS(Y2);
WHILE MAXCOEF<268435456 DO BEGIN MAXCOEF:=MAXCOEF+MAXCOEF;X0:=X0+X0;
X1:=X1+X1;X2:=X2+X2;Y0:=Y0+Y0;Y1:=Y1+Y1;Y2:=Y2+Y2;END;{:453};{458:}
DX:=X0;DY:=Y0;IF DX=0 THEN IF DY=0 THEN BEGIN DX:=X1;DY:=Y1;
IF DX=0 THEN IF DY=0 THEN BEGIN DX:=X2;DY:=Y2;END;END{:458};
IF DX=0 THEN{462:}
FINOFFSETPRE(P,N,MEM[MEM[LH].HH.LH].HH.LH,-X0,-X1,-X2,-Y0,-Y1,-Y2,FALSE,
N){:462}ELSE BEGIN{459:}K:=1;W:=MEM[LH].HH.RH;
WHILE TRUE DO BEGIN IF K=N THEN GOTO 30;WW:=MEM[W].HH.RH;
IF ABVSCD(DY,ABS(MEM[WW+1].INT-MEM[W+1].INT),DX,ABS(MEM[WW+2].INT-MEM[W
+2].INT))>=0 THEN BEGIN K:=K+1;W:=WW;END ELSE GOTO 30;END;30:{:459};
{460:}IF K=1 THEN T:=268435457 ELSE BEGIN WW:=MEM[W].HH.LH;{455:}
DU:=MEM[WW+1].INT-MEM[W+1].INT;DV:=MEM[WW+2].INT-MEM[W+2].INT;
IF ABS(DU)>=ABS(DV)THEN BEGIN S:=MAKEFRACTION(DV,DU);
T0:=TAKEFRACTION(X0,S)-Y0;T1:=TAKEFRACTION(X1,S)-Y1;
T2:=TAKEFRACTION(X2,S)-Y2;END ELSE BEGIN S:=MAKEFRACTION(DU,DV);
T0:=X0-TAKEFRACTION(Y0,S);T1:=X1-TAKEFRACTION(Y1,S);
T2:=X2-TAKEFRACTION(Y2,S);END{:455};T:=CROSSINGPOIN(-T0,-T1,-T2);END;
IF T>=268435456 THEN FINOFFSETPRE(P,K,W,X0,X1,X2,Y0,Y1,Y2,TRUE,N)ELSE
BEGIN SPLITFOROFFS(P,T);R:=MEM[P].HH.RH;X1A:=X0-TAKEFRACTION(X0-X1,T);
X1:=X1-TAKEFRACTION(X1-X2,T);X2A:=X1A-TAKEFRACTION(X1A-X1,T);
Y1A:=Y0-TAKEFRACTION(Y0-Y1,T);Y1:=Y1-TAKEFRACTION(Y1-Y2,T);
Y2A:=Y1A-TAKEFRACTION(Y1A-Y1,T);
FINOFFSETPRE(P,K,W,X0,X1A,X2A,Y0,Y1A,Y2A,TRUE,N);X0:=X2A;Y0:=Y2A;
T1:=T1-TAKEFRACTION(T1-T2,T);IF T1<0 THEN T1:=0;
T:=CROSSINGPOIN(0,T1,T2);IF T<268435456 THEN{461:}
BEGIN SPLITFOROFFS(R,T);X1A:=X1-TAKEFRACTION(X1-X2,T);
X1:=X0-TAKEFRACTION(X0-X1,T);X0A:=X1-TAKEFRACTION(X1-X1A,T);
Y1A:=Y1-TAKEFRACTION(Y1-Y2,T);Y1:=Y0-TAKEFRACTION(Y0-Y1,T);
Y0A:=Y1-TAKEFRACTION(Y1-Y1A,T);
FINOFFSETPRE(MEM[R].HH.RH,K,W,X0A,X1A,X2,Y0A,Y1A,Y2,TRUE,N);X2:=X0A;
Y2:=Y0A;END{:461};
FINOFFSETPRE(R,K-1,WW,-X0,-X1,-X2,-Y0,-Y1,-Y2,FALSE,N);END{:460};END;
END{:451};{449:}REPEAT R:=MEM[P].HH.RH;
IF MEM[P+1].INT=MEM[P+5].INT THEN IF MEM[P+2].INT=MEM[P+6].INT THEN IF
MEM[P+1].INT=MEM[R+3].INT THEN IF MEM[P+2].INT=MEM[R+4].INT THEN IF MEM[
P+1].INT=MEM[R+1].INT THEN IF MEM[P+2].INT=MEM[R+2].INT THEN BEGIN
REMOVECUBIC(P);IF R=Q THEN Q:=P;R:=P;END;P:=R;UNTIL P=Q{:449};END;END;
{:448}{463:}{469:}PROCEDURE SKEWLINEEDGE(X0,Y0,X1,Y1:SCALED);
BEGIN UNROTATE(X0+Y0-32768,Y0-32768,OCTANT);X0:=CURX;Y0:=CURY;
UNROTATE(X1+Y1-32768,Y1-32768,OCTANT);
IF INTERNAL[8]>65536 THEN BEGIN PRINTNL(432);PRINTTWO(X0,Y0);PRINT(430);
PRINTTWO(CURX,CURY);PRINTNL(311);END;LINEEDGES(X0,Y0,CURX,CURY);END;
{:469}PROCEDURE FILLENVELOPE(SPECHEAD,PENHEAD:HALFWORD);
LABEL 30,31,32,33;VAR P,Q,R,S:HALFWORD;H:HALFWORD;M0,N0,M1,N1:INTEGER;
X0,Y0,X1,Y1:SCALED;D0,DD0,D1:0..1;XX,YY,XP,YP,DELX,DELY,TX,TY:SCALED;
{466:}XX0,YY0,XX1,YY1:SCALED;MM0,NN0,MM1,NN1:INTEGER;M,N:INTEGER;
K:INTEGER;W,WW:HALFWORD;SMOOTHBOT,SMOOTHTOP:0..MOVESIZE;{:466}
BEGIN IF INTERNAL[8]>0 THEN BEGINEDGETRA;P:=SPECHEAD;
REPEAT OCTANT:=MEM[P+3].INT;H:=PENHEAD+OCTANT;{425:}Q:=P;
WHILE MEM[Q].HH.B1<>0 DO Q:=MEM[Q].HH.RH{:425};{464:}X0:=MEM[P+1].INT;
Y0:=MEM[P+2].INT;X1:=MEM[Q+1].INT;Y1:=MEM[Q+2].INT;W:=MEM[H].HH.RH;
IF MEM[P+4].INT>=2 THEN W:=MEM[W].HH.LH;
IF INTERNAL[8]>65536 THEN BEGIN PRINTNL(426);
PRINTINT(OCTANTNUMBER[OCTANT]);PRINT(427);PRINTINT(MEM[H].HH.LH);
PRINT(428);IF MEM[H].HH.LH<>1 THEN PRINTCHAR(115);
UNROTATE(X0+MEM[W+1].INT+MEM[W+2].INT,Y0+MEM[W+2].INT,OCTANT);
PRINT(429);PRINTTWO(CURX,CURY);WW:=W;END;
MAKEGOOD(X0+MEM[W+1].INT+MEM[W+2].INT,Y0+MEM[W+2].INT,MEM[P+4].INT,TRUE)
;M0:=CURM;N0:=CURN;D0:=CURD;DD0:=CURDD;XX:=(CURX-CURY)-MEM[W+1].INT;
YY:=CURY+32768-MEM[W+2].INT;W:=MEM[H].HH.RH;
IF MEM[Q+6].INT>=2 THEN W:=MEM[W].HH.LH;
IF INTERNAL[8]>65536 THEN BEGIN PRINT(430);
UNROTATE(X1+MEM[W+1].INT+MEM[W+2].INT,Y1+MEM[W+2].INT,OCTANT);
PRINTTWO(CURX,CURY);END;
MAKEGOOD(X1+MEM[W+1].INT+MEM[W+2].INT,Y1+MEM[W+2].INT,MEM[Q+6].INT,FALSE
);M1:=CURM;N1:=CURN;
IF SKEW(P,Q,XX,YY,CURX-CURY-MEM[W+1].INT,CURY+32768-MEM[W+2].INT)THEN
BEGIN D1:=CURD;
IF INTERNAL[8]>65536 THEN IF INTERNAL[30]>0 THEN BEGIN PRINTNL(431);
UNROTATE(MEM[P+1].INT+MEM[P+2].INT-32768+MEM[WW+1].INT+MEM[WW+2].INT,MEM
[P+2].INT-32768+MEM[WW+2].INT,OCTANT);PRINTTWO(CURX,CURY);PRINT(430);
UNROTATE(MEM[Q+1].INT+MEM[Q+2].INT-32768+MEM[W+1].INT+MEM[W+2].INT,MEM[Q
+2].INT-32768+MEM[W+2].INT,OCTANT);PRINTTWO(CURX,CURY);END;
END ELSE BEGIN D1:=CURDD;D0:=DD0;END{:464};OFFSETPREP(P,H);{425:}Q:=P;
WHILE MEM[Q].HH.B1<>0 DO Q:=MEM[Q].HH.RH{:425};{467:}
IF ODD(OCTANTNUMBER[OCTANT])THEN BEGIN{468:}K:=0;W:=MEM[H].HH.RH;
WW:=MEM[W].HH.LH;XX0:=MEM[P+1].INT+MEM[W+1].INT;
YY0:=MEM[P+2].INT+MEM[W+2].INT;IF MEM[P+4].INT>=2 THEN{470:}
BEGIN SKEWLINEEDGE(MEM[P+1].INT+MEM[WW+1].INT,MEM[P+2].INT+MEM[WW+2].INT
,XX0,YY0);YY:=YY0-32768;XX:=XX0+YY;M0:=ROUNDUNSCALE(XX-XCORR[OCTANT]);
N0:=ROUNDUNSCALE(YY-YCORR[OCTANT]);
IF XX-M0*65536>=YY-N0*65536+XYCORR[OCTANT]THEN D0:=1 ELSE D0:=0;
END{:470};XX1:=MEM[Q+1].INT+MEM[WW+1].INT;
YY1:=MEM[Q+2].INT+MEM[WW+2].INT;NN0:=FLOORUNSCALE(YY0-YCORR[OCTANT]);
NN1:=FLOORUNSCALE(YY1-YCORR[OCTANT]);
IF NN1-NN0>=MOVESIZE THEN OVERFLOW(390,MOVESIZE);
MM0:=FLOORUNSCALE(XX0-XYCORR[OCTANT]);
MM1:=FLOORUNSCALE(XX1-XYCORR[OCTANT]);
FOR N:=0 TO NN1-NN0 DO ENVMOVE[N]:=MM0;ENVMOVE[NN1-NN0]:=MM1;MOVEPTR:=0;
M:=MM0{:468};R:=P;MEM[Q].HH.B1:=MEM[H].HH.LH+1;
WHILE TRUE DO BEGIN IF R=Q THEN SMOOTHTOP:=MOVEPTR;
WHILE MEM[R].HH.B1<>K DO{472:}BEGIN XX:=MEM[R+1].INT+MEM[W+1].INT;
YY:=MEM[R+2].INT+MEM[W+2].INT;
IF INTERNAL[8]>65536 THEN BEGIN PRINTNL(433);PRINTINT(K);PRINT(434);
UNROTATE(XX+YY-32768,YY-32768,OCTANT);PRINTTWO(CURX,CURY);END;
IF MEM[R].HH.B1>K THEN BEGIN K:=K+1;W:=MEM[W].HH.RH;
XP:=MEM[R+1].INT+MEM[W+1].INT;YP:=MEM[R+2].INT+MEM[W+2].INT;
IF YP<>YY THEN{473:}BEGIN TY:=FLOORSCALED(YY-YCORR[OCTANT]);DELY:=YP-YY;
YY:=YY-TY;TY:=YP-YCORR[OCTANT]-TY;IF TY>=65536 THEN BEGIN DELX:=XP-XX;
YY:=65536-YY;
WHILE TRUE DO BEGIN TX:=TAKEFRACTION(DELX,MAKEFRACTION(YY,DELY));
IF ABVSCD(TX,DELY,DELX,YY)+XYCORR[OCTANT]>0 THEN TX:=TX-1;
M:=FLOORUNSCALE(XX+TX);IF M>ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;
TY:=TY-65536;IF TY<65536 THEN GOTO 31;YY:=YY+65536;MOVEPTR:=MOVEPTR+1;
END;31:END;END{:473};END ELSE BEGIN K:=K-1;W:=MEM[W].HH.LH;
XP:=MEM[R+1].INT+MEM[W+1].INT;YP:=MEM[R+2].INT+MEM[W+2].INT;END;
IF INTERNAL[8]>65536 THEN BEGIN PRINT(430);
UNROTATE(XP+YP-32768,YP-32768,OCTANT);PRINTTWO(CURX,CURY);PRINTNL(311);
END;M:=FLOORUNSCALE(XP-XYCORR[OCTANT]);
MOVEPTR:=FLOORUNSCALE(YP-YCORR[OCTANT])-NN0;
IF M>ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;END{:472};
IF R=Q THEN GOTO 30;IF R=P THEN SMOOTHBOT:=MOVEPTR;MOVE[MOVEPTR]:=1;
N:=MOVEPTR;S:=MEM[R].HH.RH;
MAKEMOVES(MEM[R+1].INT+MEM[W+1].INT,MEM[R+5].INT+MEM[W+1].INT,MEM[S+3].
INT+MEM[W+1].INT,MEM[S+1].INT+MEM[W+1].INT,MEM[R+2].INT+MEM[W+2].INT,MEM
[R+6].INT+MEM[W+2].INT,MEM[S+4].INT+MEM[W+2].INT,MEM[S+2].INT+MEM[W+2].
INT,XYCORR[OCTANT],YCORR[OCTANT]);{471:}REPEAT M:=M+MOVE[N]-1;
IF M>ENVMOVE[N]THEN ENVMOVE[N]:=M;N:=N+1;UNTIL N>MOVEPTR{:471};R:=S;END;
30:{474:}IF MEM[Q+6].INT<2 THEN BEGIN YY:=YY1-32768;XX:=XX1+YY;
M1:=ROUNDUNSCALE(XX-XCORR[OCTANT]);N1:=ROUNDUNSCALE(YY-YCORR[OCTANT]);
IF XX-M1*65536>=YY-N1*65536+XYCORR[OCTANT]THEN D1:=1 ELSE D1:=0;END;
IF(M<>MM1)OR(MOVEPTR<>NN1-NN0)THEN CONFUSION(49);
MOVE[0]:=D0+ENVMOVE[0]-MM0;
FOR N:=1 TO MOVEPTR DO MOVE[N]:=ENVMOVE[N]-ENVMOVE[N-1]+1;
MOVE[MOVEPTR]:=MOVE[MOVEPTR]-D1;
IF INTERNAL[29]>0 THEN SMOOTHMOVES(SMOOTHBOT,SMOOTHTOP);
MOVETOEDGES(M0,N0,M1,N1,OCTANT);
IF MEM[Q+6].INT<2 THEN BEGIN WW:=MEM[H].HH.RH;
SKEWLINEEDGE(XX1,YY1,MEM[Q+1].INT+MEM[WW+1].INT,MEM[Q+2].INT+MEM[WW+2].
INT);END{:474};END ELSE{475:}BEGIN{476:}K:=MEM[H].HH.LH+1;
WW:=MEM[H].HH.RH;W:=MEM[WW].HH.LH;XX0:=MEM[P+1].INT+MEM[W+1].INT;
YY0:=MEM[P+2].INT+MEM[W+2].INT;IF MEM[P+4].INT<2 THEN{470:}
BEGIN SKEWLINEEDGE(MEM[P+1].INT+MEM[WW+1].INT,MEM[P+2].INT+MEM[WW+2].INT
,XX0,YY0);YY:=YY0-32768;XX:=XX0+YY;M0:=ROUNDUNSCALE(XX-XCORR[OCTANT]);
N0:=ROUNDUNSCALE(YY-YCORR[OCTANT]);
IF XX-M0*65536>=YY-N0*65536+XYCORR[OCTANT]THEN D0:=1 ELSE D0:=0;
END{:470};XX1:=MEM[Q+1].INT+MEM[WW+1].INT;
YY1:=MEM[Q+2].INT+MEM[WW+2].INT;NN0:=FLOORUNSCALE(YY0-YCORR[OCTANT]);
NN1:=FLOORUNSCALE(YY1-YCORR[OCTANT]);
IF NN1-NN0>=MOVESIZE THEN OVERFLOW(390,MOVESIZE);
MM0:=FLOORUNSCALE(XX0-XYCORR[OCTANT]);
MM1:=FLOORUNSCALE(XX1-XYCORR[OCTANT]);
FOR N:=1 TO NN1-NN0+1 DO ENVMOVE[N]:=MM1;ENVMOVE[0]:=MM0;MOVEPTR:=0;
M:=MM0{:476};R:=P;WHILE TRUE DO BEGIN IF R=Q THEN SMOOTHTOP:=MOVEPTR;
WHILE MEM[R].HH.B1<>K DO{478:}BEGIN XX:=MEM[R+1].INT+MEM[W+1].INT;
YY:=MEM[R+2].INT+MEM[W+2].INT;
IF INTERNAL[8]>65536 THEN BEGIN PRINTNL(433);PRINTINT(K);PRINT(434);
UNROTATE(XX+YY-32768,YY-32768,OCTANT);PRINTTWO(CURX,CURY);END;
IF MEM[R].HH.B1<K THEN BEGIN K:=K-1;W:=MEM[W].HH.LH;
XP:=MEM[R+1].INT+MEM[W+1].INT;YP:=MEM[R+2].INT+MEM[W+2].INT;
IF YP<>YY THEN{479:}BEGIN TY:=FLOORSCALED(YY-YCORR[OCTANT]);DELY:=YP-YY;
YY:=YY-TY;TY:=YP-YCORR[OCTANT]-TY;IF TY>=65536 THEN BEGIN DELX:=XP-XX;
YY:=65536-YY;
WHILE TRUE DO BEGIN IF M<ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;
TX:=TAKEFRACTION(DELX,MAKEFRACTION(YY,DELY));
IF ABVSCD(TX,DELY,DELX,YY)+XYCORR[OCTANT]>0 THEN TX:=TX-1;
M:=FLOORUNSCALE(XX+TX);TY:=TY-65536;MOVEPTR:=MOVEPTR+1;
IF TY<65536 THEN GOTO 32;YY:=YY+65536;END;
32:IF M<ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;END;END{:479};
END ELSE BEGIN K:=K+1;W:=MEM[W].HH.RH;XP:=MEM[R+1].INT+MEM[W+1].INT;
YP:=MEM[R+2].INT+MEM[W+2].INT;END;
IF INTERNAL[8]>65536 THEN BEGIN PRINT(430);
UNROTATE(XP+YP-32768,YP-32768,OCTANT);PRINTTWO(CURX,CURY);PRINTNL(311);
END;M:=FLOORUNSCALE(XP-XYCORR[OCTANT]);
MOVEPTR:=FLOORUNSCALE(YP-YCORR[OCTANT])-NN0;
IF M<ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;END{:478};
IF R=Q THEN GOTO 33;IF R=P THEN SMOOTHBOT:=MOVEPTR;MOVE[MOVEPTR]:=1;
N:=MOVEPTR;S:=MEM[R].HH.RH;
MAKEMOVES(MEM[R+1].INT+MEM[W+1].INT,MEM[R+5].INT+MEM[W+1].INT,MEM[S+3].
INT+MEM[W+1].INT,MEM[S+1].INT+MEM[W+1].INT,MEM[R+2].INT+MEM[W+2].INT,MEM
[R+6].INT+MEM[W+2].INT,MEM[S+4].INT+MEM[W+2].INT,MEM[S+2].INT+MEM[W+2].
INT,XYCORR[OCTANT],YCORR[OCTANT]);{477:}
REPEAT IF M<ENVMOVE[N]THEN ENVMOVE[N]:=M;M:=M+MOVE[N]-1;N:=N+1;
UNTIL N>MOVEPTR{:477};R:=S;END;33:{480:}
IF MEM[Q+6].INT>=2 THEN BEGIN YY:=YY1-32768;XX:=XX1+YY;
M1:=ROUNDUNSCALE(XX-XCORR[OCTANT]);N1:=ROUNDUNSCALE(YY-YCORR[OCTANT]);
IF XX-M1*65536>=YY-N1*65536+XYCORR[OCTANT]THEN D1:=1 ELSE D1:=0;END;
IF(M<>MM1)OR(MOVEPTR<>NN1-NN0)THEN CONFUSION(50);
MOVE[0]:=D0+ENVMOVE[1]-MM0;
FOR N:=1 TO MOVEPTR DO MOVE[N]:=ENVMOVE[N+1]-ENVMOVE[N]+1;
MOVE[MOVEPTR]:=MOVE[MOVEPTR]-D1;
IF INTERNAL[29]>0 THEN SMOOTHMOVES(SMOOTHBOT,SMOOTHTOP);
MOVETOEDGES(M0,N0,M1,N1,OCTANT);
IF MEM[Q+6].INT>=2 THEN BEGIN WW:=MEM[MEM[H].HH.RH].HH.LH;
SKEWLINEEDGE(XX1,YY1,MEM[Q+1].INT+MEM[WW+1].INT,MEM[Q+2].INT+MEM[WW+2].
INT);END{:480};END{:475};MEM[Q].HH.B1:=0{:467};P:=MEM[Q].HH.RH;
UNTIL P=SPECHEAD;IF INTERNAL[8]>0 THEN ENDEDGETRACI;
TOSSKNOTLIST(SPECHEAD);END;{:463}{484:}
FUNCTION MAKEELLIPSE(MAJORAXIS,MINORAXIS:SCALED;THETA:ANGLE):HALFWORD;
LABEL 30,40;VAR P,Q,R,S:HALFWORD;H:HALFWORD;
ALPHA,BETA,GAMMA,DELTA:INTEGER;C,D:INTEGER;U,V:INTEGER;BEGIN{485:}
P:=GETNODE(7);Q:=GETNODE(7);R:=GETNODE(7);S:=GETNODE(7);H:=P;
MEM[P].HH.RH:=Q;MEM[Q].HH.RH:=R;MEM[R].HH.RH:=S;{487:}
IF(THETA=0)OR(MAJORAXIS=MINORAXIS)THEN BEGIN ALPHA:=0;BETA:=MINORAXIS;
GAMMA:=MAJORAXIS;END ELSE BEGIN NSINCOS(THETA);
GAMMA:=TAKEFRACTION(MAJORAXIS,NSIN);DELTA:=TAKEFRACTION(MINORAXIS,NCOS);
BETA:=PYTHADD(GAMMA,DELTA);
ALPHA:=TAKEFRACTION(TAKEFRACTION(MAJORAXIS,MAKEFRACTION(GAMMA,BETA)),
NCOS)-TAKEFRACTION(TAKEFRACTION(MINORAXIS,MAKEFRACTION(DELTA,BETA)),NSIN
);ALPHA:=(ALPHA+32768)DIV 65536;
GAMMA:=PYTHADD(TAKEFRACTION(MAJORAXIS,NCOS),TAKEFRACTION(MINORAXIS,NSIN)
);END;BETA:=(BETA+32768)DIV 65536;GAMMA:=(GAMMA+32768)DIV 65536{:487};
{486:}IF BETA=0 THEN BETA:=1;IF GAMMA=0 THEN GAMMA:=1;
IF GAMMA<=ABS(ALPHA)THEN IF ALPHA>0 THEN ALPHA:=GAMMA-1 ELSE ALPHA:=1-
GAMMA{:486};MEM[S+1].INT:=ALPHA*32768;MEM[P+1].INT:=-MEM[S+1].INT;
MEM[S+2].INT:=BETA*32768;MEM[P+2].INT:=-MEM[S+2].INT;
MEM[Q+2].INT:=MEM[P+2].INT;MEM[R+2].INT:=MEM[S+2].INT;
MEM[Q+1].INT:=GAMMA*32768;MEM[R+1].INT:=MEM[Q+1].INT;MEM[P+5].INT:=0;
MEM[Q+3].INT:=-32768;MEM[Q+5].INT:=32768;MEM[R+3].INT:=0;
MEM[R+5].INT:=0;MEM[S+3].INT:=32768;MEM[P+6].INT:=BETA;
MEM[Q+6].INT:=GAMMA;MEM[R+6].INT:=BETA;MEM[Q+4].INT:=GAMMA+ALPHA;
MEM[R+4].INT:=BETA+BETA;MEM[S+4].INT:=GAMMA-ALPHA{:485};{488:}
WHILE TRUE DO BEGIN U:=MEM[P+5].INT+MEM[Q+5].INT;
V:=MEM[Q+3].INT+MEM[R+3].INT;C:=MEM[P+6].INT+MEM[Q+6].INT;{490:}
DELTA:=PYTHADD(U,V);
IF MAJORAXIS=MINORAXIS THEN D:=MAJORAXIS ELSE BEGIN IF THETA=0 THEN
BEGIN ALPHA:=U;BETA:=V;
END ELSE BEGIN ALPHA:=TAKEFRACTION(U,NCOS)+TAKEFRACTION(V,NSIN);
BETA:=TAKEFRACTION(V,NCOS)-TAKEFRACTION(U,NSIN);END;
ALPHA:=MAKEFRACTION(ALPHA,DELTA);BETA:=MAKEFRACTION(BETA,DELTA);
D:=PYTHADD(TAKEFRACTION(MAJORAXIS,ALPHA),TAKEFRACTION(MINORAXIS,BETA));
END;D:=TAKEFRACTION((D+4)DIV 8,DELTA);
IF ABS(U)>=ABS(V)THEN ALPHA:=ABS(U)DIV 32768 ELSE ALPHA:=ABS(V)DIV 32768
;IF D<ALPHA THEN D:=ALPHA{:490};DELTA:=C-D;
IF DELTA>0 THEN BEGIN IF DELTA>MEM[R+4].INT THEN DELTA:=MEM[R+4].INT;
IF DELTA>=MEM[Q+4].INT THEN{491:}BEGIN DELTA:=MEM[Q+4].INT;
MEM[P+6].INT:=C-DELTA;MEM[P+5].INT:=U;MEM[Q+3].INT:=V;
MEM[Q+1].INT:=MEM[Q+1].INT-DELTA*MEM[R+3].INT;
MEM[Q+2].INT:=MEM[Q+2].INT+DELTA*MEM[Q+5].INT;
MEM[R+4].INT:=MEM[R+4].INT-DELTA;END{:491}ELSE{492:}BEGIN S:=GETNODE(7);
MEM[P].HH.RH:=S;MEM[S].HH.RH:=Q;
MEM[S+1].INT:=MEM[Q+1].INT+DELTA*MEM[Q+3].INT;
MEM[S+2].INT:=MEM[Q+2].INT-DELTA*MEM[P+5].INT;
MEM[Q+1].INT:=MEM[Q+1].INT-DELTA*MEM[R+3].INT;
MEM[Q+2].INT:=MEM[Q+2].INT+DELTA*MEM[Q+5].INT;
MEM[S+3].INT:=MEM[Q+3].INT;MEM[S+5].INT:=U;MEM[Q+3].INT:=V;
MEM[S+6].INT:=C-DELTA;MEM[S+4].INT:=MEM[Q+4].INT-DELTA;
MEM[Q+4].INT:=DELTA;MEM[R+4].INT:=MEM[R+4].INT-DELTA;END{:492};
END ELSE P:=Q;{489:}WHILE TRUE DO BEGIN Q:=MEM[P].HH.RH;
IF Q=0 THEN GOTO 30;
IF MEM[Q+4].INT=0 THEN BEGIN MEM[P].HH.RH:=MEM[Q].HH.RH;
MEM[P+6].INT:=MEM[Q+6].INT;MEM[P+5].INT:=MEM[Q+5].INT;FREENODE(Q,7);
END ELSE BEGIN R:=MEM[Q].HH.RH;IF R=0 THEN GOTO 30;
IF MEM[R+4].INT=0 THEN BEGIN MEM[P].HH.RH:=R;FREENODE(Q,7);P:=R;
END ELSE GOTO 40;END;END;40:{:489};END;30:{:488};{493:}
IF Q<>0 THEN BEGIN IF MEM[H+5].INT=0 THEN BEGIN P:=H;H:=MEM[H].HH.RH;
FREENODE(P,7);MEM[Q+1].INT:=-MEM[H+1].INT;END;P:=Q;END ELSE Q:=P;
R:=MEM[H].HH.RH;REPEAT S:=GETNODE(7);MEM[P].HH.RH:=S;P:=S;
MEM[P+1].INT:=-MEM[R+1].INT;MEM[P+2].INT:=-MEM[R+2].INT;R:=MEM[R].HH.RH;
UNTIL R=Q;MEM[P].HH.RH:=H{:493};MAKEELLIPSE:=H;END;{:484}{495:}
FUNCTION FINDDIRECTIO(X,Y:SCALED;H:HALFWORD):SCALED;LABEL 10,40,45,30;
VAR MAX:SCALED;P,Q:HALFWORD;N:SCALED;TT:SCALED;{498:}
X1,X2,X3,Y1,Y2,Y3:SCALED;THETA,PHI:ANGLE;T:FRACTION;{:498}BEGIN{496:}
IF ABS(X)<ABS(Y)THEN BEGIN X:=MAKEFRACTION(X,ABS(Y));
IF Y>0 THEN Y:=268435456 ELSE Y:=-268435456;
END ELSE IF X=0 THEN BEGIN FINDDIRECTIO:=0;GOTO 10;
END ELSE BEGIN Y:=MAKEFRACTION(Y,ABS(X));
IF X>0 THEN X:=268435456 ELSE X:=-268435456;END{:496};N:=0;P:=H;
WHILE TRUE DO BEGIN IF MEM[P].HH.B1=0 THEN GOTO 45;Q:=MEM[P].HH.RH;
{497:}TT:=0;{499:}X1:=MEM[P+5].INT-MEM[P+1].INT;
X2:=MEM[Q+3].INT-MEM[P+5].INT;X3:=MEM[Q+1].INT-MEM[Q+3].INT;
Y1:=MEM[P+6].INT-MEM[P+2].INT;Y2:=MEM[Q+4].INT-MEM[P+6].INT;
Y3:=MEM[Q+2].INT-MEM[Q+4].INT;MAX:=ABS(X1);
IF ABS(X2)>MAX THEN MAX:=ABS(X2);IF ABS(X3)>MAX THEN MAX:=ABS(X3);
IF ABS(Y1)>MAX THEN MAX:=ABS(Y1);IF ABS(Y2)>MAX THEN MAX:=ABS(Y2);
IF ABS(Y3)>MAX THEN MAX:=ABS(Y3);IF MAX=0 THEN GOTO 40;
WHILE MAX<134217728 DO BEGIN MAX:=MAX+MAX;X1:=X1+X1;X2:=X2+X2;X3:=X3+X3;
Y1:=Y1+Y1;Y2:=Y2+Y2;Y3:=Y3+Y3;END;T:=X1;
X1:=TAKEFRACTION(X1,X)+TAKEFRACTION(Y1,Y);
Y1:=TAKEFRACTION(Y1,X)-TAKEFRACTION(T,Y);T:=X2;
X2:=TAKEFRACTION(X2,X)+TAKEFRACTION(Y2,Y);
Y2:=TAKEFRACTION(Y2,X)-TAKEFRACTION(T,Y);T:=X3;
X3:=TAKEFRACTION(X3,X)+TAKEFRACTION(Y3,Y);
Y3:=TAKEFRACTION(Y3,X)-TAKEFRACTION(T,Y){:499};
IF Y1=0 THEN IF X1>=0 THEN GOTO 40;IF N>0 THEN BEGIN{500:}
THETA:=NARG(X1,Y1);
IF THETA>=0 THEN IF PHI<=0 THEN IF PHI>=THETA-188743680 THEN GOTO 40;
IF THETA<=0 THEN IF PHI>=0 THEN IF PHI<=THETA+188743680 THEN GOTO 40{:
500};IF P=H THEN GOTO 45;END;PHI:=NARG(X3,Y3);{502:}
IF X1<0 THEN IF X2<0 THEN IF X3<0 THEN GOTO 30;
IF ABVSCD(Y1,Y3,Y2,Y2)=0 THEN{504:}
BEGIN IF ABVSCD(Y1,Y2,0,0)<0 THEN BEGIN T:=MAKEFRACTION(Y1,Y1-Y2);
X1:=X1-TAKEFRACTION(X1-X2,T);X2:=X2-TAKEFRACTION(X2-X3,T);
IF X1-TAKEFRACTION(X1-X2,T)>=0 THEN BEGIN TT:=(T+2048)DIV 4096;GOTO 40;
END;END ELSE IF Y1=0 THEN IF Y3=0 THEN{505:}
BEGIN T:=CROSSINGPOIN(-X1,-X2,-X3);
IF T<=268435456 THEN BEGIN TT:=(T+2048)DIV 4096;GOTO 40;END;
IF ABVSCD(X1,X3,X2,X2)<=0 THEN BEGIN T:=MAKEFRACTION(X1,X1-X2);
BEGIN TT:=(T+2048)DIV 4096;GOTO 40;END;END;END{:505};GOTO 30;END{:504};
IF Y1<=0 THEN IF Y1<0 THEN BEGIN Y1:=-Y1;Y2:=-Y2;Y3:=-Y3;
END ELSE IF Y2>0 THEN BEGIN Y2:=-Y2;Y3:=-Y3;END;{503:}
T:=CROSSINGPOIN(Y1,Y2,Y3);IF T>268435456 THEN GOTO 30;
Y2:=Y2-TAKEFRACTION(Y2-Y3,T);X1:=X1-TAKEFRACTION(X1-X2,T);
X2:=X2-TAKEFRACTION(X2-X3,T);X1:=X1-TAKEFRACTION(X1-X2,T);
IF X1>=0 THEN BEGIN TT:=(T+2048)DIV 4096;GOTO 40;END;IF Y2>0 THEN Y2:=0;
TT:=T;T:=CROSSINGPOIN(0,-Y2,-Y3);IF T>268435456 THEN GOTO 30;
X1:=X1-TAKEFRACTION(X1-X2,T);X2:=X2-TAKEFRACTION(X2-X3,T);
IF X1-TAKEFRACTION(X1-X2,T)>=0 THEN BEGIN T:=TT-TAKEFRACTION(TT
-268435456,T);BEGIN TT:=(T+2048)DIV 4096;GOTO 40;END;END{:503};30:{:502}
{:497};P:=Q;N:=N+65536;END;45:FINDDIRECTIO:=-65536;GOTO 10;
40:FINDDIRECTIO:=N+TT;10:END;{:495}{511:}
PROCEDURE CUBICINTERSE(P,PP:HALFWORD);LABEL 22,45,10;
VAR DELX,DELY:INTEGER;UV,XY:0..BISTACKSIZE;Q,QQ:HALFWORD;BEGIN{512:}
Q:=MEM[P].HH.RH;QQ:=MEM[PP].HH.RH;BISECTPTR:=20;
BISECTSTACK[BISECTPTR-5]:=MEM[P+5].INT-MEM[P+1].INT;
BISECTSTACK[BISECTPTR-4]:=MEM[Q+3].INT-MEM[P+5].INT;
BISECTSTACK[BISECTPTR-3]:=MEM[Q+1].INT-MEM[Q+3].INT;
IF BISECTSTACK[BISECTPTR-5]<0 THEN IF BISECTSTACK[BISECTPTR-3]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-4]<0 THEN BISECTSTACK[BISECTPTR-2]:=
BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR-4]ELSE BISECTSTACK[
BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-1]<0 THEN BISECTSTACK[BISECTPTR-1]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-2]>BISECTSTACK[BISECTPTR-5]THEN BISECTSTACK[
BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4];IF BISECTSTACK[BISECTPTR-1]<0 THEN BISECTSTACK[BISECTPTR-1]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-3]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-4]>0 THEN BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]ELSE BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[
BISECTPTR-5];
BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-2]>0 THEN BISECTSTACK[BISECTPTR-2]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-1]<BISECTSTACK[BISECTPTR-5]THEN BISECTSTACK[
BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4];IF BISECTSTACK[BISECTPTR-2]>0 THEN BISECTSTACK[BISECTPTR-2]:=0;END;
BISECTSTACK[BISECTPTR-10]:=MEM[P+6].INT-MEM[P+2].INT;
BISECTSTACK[BISECTPTR-9]:=MEM[Q+4].INT-MEM[P+6].INT;
BISECTSTACK[BISECTPTR-8]:=MEM[Q+2].INT-MEM[Q+4].INT;
IF BISECTSTACK[BISECTPTR-10]<0 THEN IF BISECTSTACK[BISECTPTR-8]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-9]<0 THEN BISECTSTACK[BISECTPTR-7]:=
BISECTSTACK[BISECTPTR-10]+BISECTSTACK[BISECTPTR-9]ELSE BISECTSTACK[
BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-6]<0 THEN BISECTSTACK[BISECTPTR-6]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-7]>BISECTSTACK[BISECTPTR-10]THEN BISECTSTACK[
BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9];
IF BISECTSTACK[BISECTPTR-6]<0 THEN BISECTSTACK[BISECTPTR-6]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-8]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-9]>0 THEN BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]ELSE BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[
BISECTPTR-10];
BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-7]>0 THEN BISECTSTACK[BISECTPTR-7]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-6]<BISECTSTACK[BISECTPTR-10]THEN BISECTSTACK[
BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9];
IF BISECTSTACK[BISECTPTR-7]>0 THEN BISECTSTACK[BISECTPTR-7]:=0;END;
BISECTSTACK[BISECTPTR-15]:=MEM[PP+5].INT-MEM[PP+1].INT;
BISECTSTACK[BISECTPTR-14]:=MEM[QQ+3].INT-MEM[PP+5].INT;
BISECTSTACK[BISECTPTR-13]:=MEM[QQ+1].INT-MEM[QQ+3].INT;
IF BISECTSTACK[BISECTPTR-15]<0 THEN IF BISECTSTACK[BISECTPTR-13]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-14]<0 THEN BISECTSTACK[BISECTPTR-12]:=
BISECTSTACK[BISECTPTR-15]+BISECTSTACK[BISECTPTR-14]ELSE BISECTSTACK[
BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-11]<0 THEN BISECTSTACK[BISECTPTR-11]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+
BISECTSTACK[BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-12]>BISECTSTACK[BISECTPTR-15]THEN BISECTSTACK[
BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14];
IF BISECTSTACK[BISECTPTR-11]<0 THEN BISECTSTACK[BISECTPTR-11]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-13]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-14]>0 THEN BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15
]+BISECTSTACK[BISECTPTR-14]ELSE BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[
BISECTPTR-15];
BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-12]>0 THEN BISECTSTACK[BISECTPTR-12]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+
BISECTSTACK[BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-11]<BISECTSTACK[BISECTPTR-15]THEN BISECTSTACK[
BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14];
IF BISECTSTACK[BISECTPTR-12]>0 THEN BISECTSTACK[BISECTPTR-12]:=0;END;
BISECTSTACK[BISECTPTR-20]:=MEM[PP+6].INT-MEM[PP+2].INT;
BISECTSTACK[BISECTPTR-19]:=MEM[QQ+4].INT-MEM[PP+6].INT;
BISECTSTACK[BISECTPTR-18]:=MEM[QQ+2].INT-MEM[QQ+4].INT;
IF BISECTSTACK[BISECTPTR-20]<0 THEN IF BISECTSTACK[BISECTPTR-18]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-19]<0 THEN BISECTSTACK[BISECTPTR-17]:=
BISECTSTACK[BISECTPTR-20]+BISECTSTACK[BISECTPTR-19]ELSE BISECTSTACK[
BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-16]<0 THEN BISECTSTACK[BISECTPTR-16]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+
BISECTSTACK[BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-17]>BISECTSTACK[BISECTPTR-20]THEN BISECTSTACK[
BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19];
IF BISECTSTACK[BISECTPTR-16]<0 THEN BISECTSTACK[BISECTPTR-16]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-18]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-19]>0 THEN BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20
]+BISECTSTACK[BISECTPTR-19]ELSE BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[
BISECTPTR-20];
BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-17]>0 THEN BISECTSTACK[BISECTPTR-17]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+
BISECTSTACK[BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-16]<BISECTSTACK[BISECTPTR-20]THEN BISECTSTACK[
BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19];
IF BISECTSTACK[BISECTPTR-17]>0 THEN BISECTSTACK[BISECTPTR-17]:=0;END;
DELX:=MEM[P+1].INT-MEM[PP+1].INT;DELY:=MEM[P+2].INT-MEM[PP+2].INT;
UV:=BISECTPTR;XY:=BISECTPTR;CURT:=1;CURTT:=1{:512};
WHILE TRUE DO BEGIN 22:IF DELX<=BISECTSTACK[XY-11]-BISECTSTACK[UV-2]THEN
IF DELX>=BISECTSTACK[XY-12]-BISECTSTACK[UV-1]THEN IF DELY<=BISECTSTACK[
XY-16]-BISECTSTACK[UV-7]THEN IF DELY>=BISECTSTACK[XY-17]-BISECTSTACK[UV
-6]THEN BEGIN IF CURT>=131072 THEN BEGIN CURT:=(CURT+1)DIV 2;
CURTT:=(CURTT+1)DIV 2;GOTO 10;END;{513:}BISECTSTACK[BISECTPTR]:=DELX;
BISECTSTACK[BISECTPTR+1]:=DELY;BISECTSTACK[BISECTPTR+2]:=UV;
BISECTSTACK[BISECTPTR+3]:=XY;BISECTPTR:=BISECTPTR+44;CURT:=CURT+CURT;
CURTT:=CURTT+CURTT;BISECTSTACK[BISECTPTR-25]:=BISECTSTACK[UV-5];
BISECTSTACK[BISECTPTR-3]:=BISECTSTACK[UV-3];
BISECTSTACK[BISECTPTR-24]:=(BISECTSTACK[BISECTPTR-25]+BISECTSTACK[UV-4])
DIV 2;
BISECTSTACK[BISECTPTR-4]:=(BISECTSTACK[BISECTPTR-3]+BISECTSTACK[UV-4])
DIV 2;BISECTSTACK[BISECTPTR-23]:=(BISECTSTACK[BISECTPTR-24]+BISECTSTACK[
BISECTPTR-4])DIV 2;BISECTSTACK[BISECTPTR-5]:=BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-25]<0 THEN IF BISECTSTACK[BISECTPTR-23]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-24]<0 THEN BISECTSTACK[BISECTPTR-22]:=
BISECTSTACK[BISECTPTR-25]+BISECTSTACK[BISECTPTR-24]ELSE BISECTSTACK[
BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25];
BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25]+BISECTSTACK[
BISECTPTR-24]+BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-21]<0 THEN BISECTSTACK[BISECTPTR-21]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25]+
BISECTSTACK[BISECTPTR-24]+BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-22]>BISECTSTACK[BISECTPTR-25]THEN BISECTSTACK[
BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25];
BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25]+BISECTSTACK[
BISECTPTR-24];
IF BISECTSTACK[BISECTPTR-21]<0 THEN BISECTSTACK[BISECTPTR-21]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-23]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-24]>0 THEN BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25
]+BISECTSTACK[BISECTPTR-24]ELSE BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[
BISECTPTR-25];
BISECTSTACK[BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25]+BISECTSTACK[
BISECTPTR-24]+BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-22]>0 THEN BISECTSTACK[BISECTPTR-22]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25]+
BISECTSTACK[BISECTPTR-24]+BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-21]<BISECTSTACK[BISECTPTR-25]THEN BISECTSTACK[
BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25];
BISECTSTACK[BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25]+BISECTSTACK[
BISECTPTR-24];
IF BISECTSTACK[BISECTPTR-22]>0 THEN BISECTSTACK[BISECTPTR-22]:=0;END;
IF BISECTSTACK[BISECTPTR-5]<0 THEN IF BISECTSTACK[BISECTPTR-3]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-4]<0 THEN BISECTSTACK[BISECTPTR-2]:=
BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR-4]ELSE BISECTSTACK[
BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-1]<0 THEN BISECTSTACK[BISECTPTR-1]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-2]>BISECTSTACK[BISECTPTR-5]THEN BISECTSTACK[
BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4];IF BISECTSTACK[BISECTPTR-1]<0 THEN BISECTSTACK[BISECTPTR-1]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-3]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-4]>0 THEN BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]ELSE BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[
BISECTPTR-5];
BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-2]>0 THEN BISECTSTACK[BISECTPTR-2]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-1]<BISECTSTACK[BISECTPTR-5]THEN BISECTSTACK[
BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4];IF BISECTSTACK[BISECTPTR-2]>0 THEN BISECTSTACK[BISECTPTR-2]:=0;END;
BISECTSTACK[BISECTPTR-30]:=BISECTSTACK[UV-10];
BISECTSTACK[BISECTPTR-8]:=BISECTSTACK[UV-8];
BISECTSTACK[BISECTPTR-29]:=(BISECTSTACK[BISECTPTR-30]+BISECTSTACK[UV-9])
DIV 2;
BISECTSTACK[BISECTPTR-9]:=(BISECTSTACK[BISECTPTR-8]+BISECTSTACK[UV-9])
DIV 2;BISECTSTACK[BISECTPTR-28]:=(BISECTSTACK[BISECTPTR-29]+BISECTSTACK[
BISECTPTR-9])DIV 2;BISECTSTACK[BISECTPTR-10]:=BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-30]<0 THEN IF BISECTSTACK[BISECTPTR-28]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-29]<0 THEN BISECTSTACK[BISECTPTR-27]:=
BISECTSTACK[BISECTPTR-30]+BISECTSTACK[BISECTPTR-29]ELSE BISECTSTACK[
BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30];
BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30]+BISECTSTACK[
BISECTPTR-29]+BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-26]<0 THEN BISECTSTACK[BISECTPTR-26]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30]+
BISECTSTACK[BISECTPTR-29]+BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-27]>BISECTSTACK[BISECTPTR-30]THEN BISECTSTACK[
BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30];
BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30]+BISECTSTACK[
BISECTPTR-29];
IF BISECTSTACK[BISECTPTR-26]<0 THEN BISECTSTACK[BISECTPTR-26]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-28]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-29]>0 THEN BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30
]+BISECTSTACK[BISECTPTR-29]ELSE BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[
BISECTPTR-30];
BISECTSTACK[BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30]+BISECTSTACK[
BISECTPTR-29]+BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-27]>0 THEN BISECTSTACK[BISECTPTR-27]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30]+
BISECTSTACK[BISECTPTR-29]+BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-26]<BISECTSTACK[BISECTPTR-30]THEN BISECTSTACK[
BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30];
BISECTSTACK[BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30]+BISECTSTACK[
BISECTPTR-29];
IF BISECTSTACK[BISECTPTR-27]>0 THEN BISECTSTACK[BISECTPTR-27]:=0;END;
IF BISECTSTACK[BISECTPTR-10]<0 THEN IF BISECTSTACK[BISECTPTR-8]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-9]<0 THEN BISECTSTACK[BISECTPTR-7]:=
BISECTSTACK[BISECTPTR-10]+BISECTSTACK[BISECTPTR-9]ELSE BISECTSTACK[
BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-6]<0 THEN BISECTSTACK[BISECTPTR-6]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-7]>BISECTSTACK[BISECTPTR-10]THEN BISECTSTACK[
BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9];
IF BISECTSTACK[BISECTPTR-6]<0 THEN BISECTSTACK[BISECTPTR-6]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-8]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-9]>0 THEN BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]ELSE BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[
BISECTPTR-10];
BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-7]>0 THEN BISECTSTACK[BISECTPTR-7]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-6]<BISECTSTACK[BISECTPTR-10]THEN BISECTSTACK[
BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9];
IF BISECTSTACK[BISECTPTR-7]>0 THEN BISECTSTACK[BISECTPTR-7]:=0;END;
BISECTSTACK[BISECTPTR-35]:=BISECTSTACK[XY-15];
BISECTSTACK[BISECTPTR-13]:=BISECTSTACK[XY-13];
BISECTSTACK[BISECTPTR-34]:=(BISECTSTACK[BISECTPTR-35]+BISECTSTACK[XY-14]
)DIV 2;
BISECTSTACK[BISECTPTR-14]:=(BISECTSTACK[BISECTPTR-13]+BISECTSTACK[XY-14]
)DIV 2;
BISECTSTACK[BISECTPTR-33]:=(BISECTSTACK[BISECTPTR-34]+BISECTSTACK[
BISECTPTR-14])DIV 2;
BISECTSTACK[BISECTPTR-15]:=BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-35]<0 THEN IF BISECTSTACK[BISECTPTR-33]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-34]<0 THEN BISECTSTACK[BISECTPTR-32]:=
BISECTSTACK[BISECTPTR-35]+BISECTSTACK[BISECTPTR-34]ELSE BISECTSTACK[
BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35];
BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35]+BISECTSTACK[
BISECTPTR-34]+BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-31]<0 THEN BISECTSTACK[BISECTPTR-31]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35]+
BISECTSTACK[BISECTPTR-34]+BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-32]>BISECTSTACK[BISECTPTR-35]THEN BISECTSTACK[
BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35];
BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35]+BISECTSTACK[
BISECTPTR-34];
IF BISECTSTACK[BISECTPTR-31]<0 THEN BISECTSTACK[BISECTPTR-31]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-33]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-34]>0 THEN BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35
]+BISECTSTACK[BISECTPTR-34]ELSE BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[
BISECTPTR-35];
BISECTSTACK[BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35]+BISECTSTACK[
BISECTPTR-34]+BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-32]>0 THEN BISECTSTACK[BISECTPTR-32]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35]+
BISECTSTACK[BISECTPTR-34]+BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-31]<BISECTSTACK[BISECTPTR-35]THEN BISECTSTACK[
BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35];
BISECTSTACK[BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35]+BISECTSTACK[
BISECTPTR-34];
IF BISECTSTACK[BISECTPTR-32]>0 THEN BISECTSTACK[BISECTPTR-32]:=0;END;
IF BISECTSTACK[BISECTPTR-15]<0 THEN IF BISECTSTACK[BISECTPTR-13]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-14]<0 THEN BISECTSTACK[BISECTPTR-12]:=
BISECTSTACK[BISECTPTR-15]+BISECTSTACK[BISECTPTR-14]ELSE BISECTSTACK[
BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-11]<0 THEN BISECTSTACK[BISECTPTR-11]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+
BISECTSTACK[BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-12]>BISECTSTACK[BISECTPTR-15]THEN BISECTSTACK[
BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14];
IF BISECTSTACK[BISECTPTR-11]<0 THEN BISECTSTACK[BISECTPTR-11]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-13]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-14]>0 THEN BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15
]+BISECTSTACK[BISECTPTR-14]ELSE BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[
BISECTPTR-15];
BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-12]>0 THEN BISECTSTACK[BISECTPTR-12]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+
BISECTSTACK[BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-11]<BISECTSTACK[BISECTPTR-15]THEN BISECTSTACK[
BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14];
IF BISECTSTACK[BISECTPTR-12]>0 THEN BISECTSTACK[BISECTPTR-12]:=0;END;
BISECTSTACK[BISECTPTR-40]:=BISECTSTACK[XY-20];
BISECTSTACK[BISECTPTR-18]:=BISECTSTACK[XY-18];
BISECTSTACK[BISECTPTR-39]:=(BISECTSTACK[BISECTPTR-40]+BISECTSTACK[XY-19]
)DIV 2;
BISECTSTACK[BISECTPTR-19]:=(BISECTSTACK[BISECTPTR-18]+BISECTSTACK[XY-19]
)DIV 2;
BISECTSTACK[BISECTPTR-38]:=(BISECTSTACK[BISECTPTR-39]+BISECTSTACK[
BISECTPTR-19])DIV 2;
BISECTSTACK[BISECTPTR-20]:=BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-40]<0 THEN IF BISECTSTACK[BISECTPTR-38]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-39]<0 THEN BISECTSTACK[BISECTPTR-37]:=
BISECTSTACK[BISECTPTR-40]+BISECTSTACK[BISECTPTR-39]ELSE BISECTSTACK[
BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40];
BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40]+BISECTSTACK[
BISECTPTR-39]+BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-36]<0 THEN BISECTSTACK[BISECTPTR-36]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40]+
BISECTSTACK[BISECTPTR-39]+BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-37]>BISECTSTACK[BISECTPTR-40]THEN BISECTSTACK[
BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40];
BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40]+BISECTSTACK[
BISECTPTR-39];
IF BISECTSTACK[BISECTPTR-36]<0 THEN BISECTSTACK[BISECTPTR-36]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-38]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-39]>0 THEN BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40
]+BISECTSTACK[BISECTPTR-39]ELSE BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[
BISECTPTR-40];
BISECTSTACK[BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40]+BISECTSTACK[
BISECTPTR-39]+BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-37]>0 THEN BISECTSTACK[BISECTPTR-37]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40]+
BISECTSTACK[BISECTPTR-39]+BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-36]<BISECTSTACK[BISECTPTR-40]THEN BISECTSTACK[
BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40];
BISECTSTACK[BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40]+BISECTSTACK[
BISECTPTR-39];
IF BISECTSTACK[BISECTPTR-37]>0 THEN BISECTSTACK[BISECTPTR-37]:=0;END;
IF BISECTSTACK[BISECTPTR-20]<0 THEN IF BISECTSTACK[BISECTPTR-18]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-19]<0 THEN BISECTSTACK[BISECTPTR-17]:=
BISECTSTACK[BISECTPTR-20]+BISECTSTACK[BISECTPTR-19]ELSE BISECTSTACK[
BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-16]<0 THEN BISECTSTACK[BISECTPTR-16]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+
BISECTSTACK[BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-17]>BISECTSTACK[BISECTPTR-20]THEN BISECTSTACK[
BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19];
IF BISECTSTACK[BISECTPTR-16]<0 THEN BISECTSTACK[BISECTPTR-16]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-18]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-19]>0 THEN BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20
]+BISECTSTACK[BISECTPTR-19]ELSE BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[
BISECTPTR-20];
BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-17]>0 THEN BISECTSTACK[BISECTPTR-17]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+
BISECTSTACK[BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-16]<BISECTSTACK[BISECTPTR-20]THEN BISECTSTACK[
BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19];
IF BISECTSTACK[BISECTPTR-17]>0 THEN BISECTSTACK[BISECTPTR-17]:=0;END;
UV:=BISECTPTR-20;XY:=BISECTPTR-20;DELX:=DELX+DELX;DELY:=DELY+DELY{:513};
GOTO 22;END;{514:}45:IF ODD(CURTT)THEN IF ODD(CURT)THEN{515:}
BEGIN CURT:=(CURT)DIV 2;CURTT:=(CURTT)DIV 2;IF CURT=0 THEN GOTO 10;
BISECTPTR:=BISECTPTR-44;DELX:=BISECTSTACK[BISECTPTR];
DELY:=BISECTSTACK[BISECTPTR+1];UV:=BISECTSTACK[BISECTPTR+2];
XY:=BISECTSTACK[BISECTPTR+3];GOTO 45;END{:515}ELSE BEGIN CURT:=CURT+1;
DELX:=DELX+BISECTSTACK[UV-5]+BISECTSTACK[UV-4]+BISECTSTACK[UV-3];
DELY:=DELY+BISECTSTACK[UV-10]+BISECTSTACK[UV-9]+BISECTSTACK[UV-8];
UV:=UV+20;CURTT:=CURTT-1;XY:=XY-20;
DELX:=DELX+BISECTSTACK[XY-15]+BISECTSTACK[XY-14]+BISECTSTACK[XY-13];
DELY:=DELY+BISECTSTACK[XY-20]+BISECTSTACK[XY-19]+BISECTSTACK[XY-18];
END ELSE BEGIN CURTT:=CURTT+1;
DELX:=DELX-BISECTSTACK[XY-15]-BISECTSTACK[XY-14]-BISECTSTACK[XY-13];
DELY:=DELY-BISECTSTACK[XY-20]-BISECTSTACK[XY-19]-BISECTSTACK[XY-18];
XY:=XY+20;END{:514};END;10:END;{:511}{516:}
PROCEDURE PATHINTERSEC(H,HH:HALFWORD);LABEL 10;VAR P,PP:HALFWORD;
N,NN:INTEGER;BEGIN{517:}
IF MEM[H].HH.B1=0 THEN BEGIN MEM[H+5].INT:=MEM[H+1].INT;
MEM[H+3].INT:=MEM[H+1].INT;MEM[H+6].INT:=MEM[H+2].INT;
MEM[H+4].INT:=MEM[H+2].INT;MEM[H].HH.B1:=1;END;
IF MEM[HH].HH.B1=0 THEN BEGIN MEM[HH+5].INT:=MEM[HH+1].INT;
MEM[HH+3].INT:=MEM[HH+1].INT;MEM[HH+6].INT:=MEM[HH+2].INT;
MEM[HH+4].INT:=MEM[HH+2].INT;MEM[HH].HH.B1:=1;END;{:517};N:=-65536;P:=H;
REPEAT IF MEM[P].HH.B1<>0 THEN BEGIN NN:=-65536;PP:=HH;
REPEAT IF MEM[PP].HH.B1<>0 THEN BEGIN CUBICINTERSE(P,PP);
IF CURT>0 THEN BEGIN CURT:=CURT+N;CURTT:=CURTT+NN;GOTO 10;END;END;
NN:=NN+65536;PP:=MEM[PP].HH.RH;UNTIL PP=HH;END;N:=N+65536;
P:=MEM[P].HH.RH;UNTIL P=H;CURT:=-65536;CURTT:=-65536;10:END;{:516}{518:}
FUNCTION INITSCREEN:BOOLEAN;VAR B:BOOLEAN;BEGIN WRITELN(LOGFILE);
WRITELN(LOGFILE,'Calling INITSCREEN, assumed true');INITSCREEN:=TRUE;
END;PROCEDURE UPDATESCREEN;
BEGIN WRITELN(LOGFILE,'Calling UPDATESCREEN');END;{:518}{521:}
PROCEDURE BLANKRECTANG(LEFTCOL,RIGHTCOL:SCREENCOL;
TOPROW,BOTROW:SCREENROW);BEGIN WRITELN(LOGFILE);
WRITELN(LOGFILE,'Calling BLANKRECTANGLE(',LEFTCOL:1,',',RIGHTCOL:1,',',
TOPROW:1,',',BOTROW:1,')');END;{:521}{522:}
PROCEDURE PAINTROW(R:SCREENROW;B:PIXELCOLOR;VAR A:TRANSSPEC;
N:SCREENCOL);VAR K:SCREENCOL;
BEGIN WRITE(LOGFILE,'Calling PAINTROW(',R:1,',',B:1,';');
FOR K:=0 TO N DO BEGIN WRITE(LOGFILE,A[K]:1);
IF K<>N THEN WRITE(LOGFILE,',');END;WRITELN(LOGFILE,')');END;{:522}
{528:}PROCEDURE OPENAWINDOW(K:WINDOWNUMBER;R0,C0,R1,C1:SCALED;
X,Y:SCALED);VAR M,N:INTEGER;BEGIN{529:}
IF R0<0 THEN R0:=0 ELSE R0:=ROUNDUNSCALE(R0);R1:=ROUNDUNSCALE(R1);
IF R1>SCREENDEPTH THEN R1:=SCREENDEPTH;
IF R1<R0 THEN IF R0>SCREENDEPTH THEN R0:=R1 ELSE R1:=R0;
IF C0<0 THEN C0:=0 ELSE C0:=ROUNDUNSCALE(C0);C1:=ROUNDUNSCALE(C1);
IF C1>SCREENWIDTH THEN C1:=SCREENWIDTH;
IF C1<C0 THEN IF C0>SCREENWIDTH THEN C0:=C1 ELSE C1:=C0{:529};
WINDOWOPEN[K]:=TRUE;WINDOWTIME[K]:=WINDOWTIME[K]+1;LEFTCOL[K]:=C0;
RIGHTCOL[K]:=C1;TOPROW[K]:=R0;BOTROW[K]:=R1;{530:}M:=ROUNDUNSCALE(X);
N:=ROUNDUNSCALE(Y)-1;MWINDOW[K]:=C0-M;NWINDOW[K]:=R0+N{:530};
BEGIN IF NOT SCREENSTARTE THEN BEGIN SCREENOK:=INITSCREEN;
SCREENSTARTE:=TRUE;END;END;
IF SCREENOK THEN BEGIN BLANKRECTANG(C0,C1,R0,R1);UPDATESCREEN;END;END;
{:528}{531:}PROCEDURE DISPEDGES(K:WINDOWNUMBER);LABEL 30,40;
VAR P,Q:HALFWORD;ALREADYTHERE:BOOLEAN;R:INTEGER;{534:}N:SCREENCOL;
W,WW:INTEGER;B:PIXELCOLOR;M,MM:INTEGER;D:INTEGER;MADJUSTMENT:INTEGER;
RIGHTEDGE:INTEGER;MINCOL:SCREENCOL;{:534}
BEGIN IF SCREENOK THEN IF LEFTCOL[K]<RIGHTCOL[K]THEN IF TOPROW[K]<BOTROW
[K]THEN BEGIN ALREADYTHERE:=FALSE;
IF MEM[CUREDGES+3].HH.RH=K THEN IF MEM[CUREDGES+4].INT=WINDOWTIME[K]THEN
ALREADYTHERE:=TRUE;
IF NOT ALREADYTHERE THEN BLANKRECTANG(LEFTCOL[K],RIGHTCOL[K],TOPROW[K],
BOTROW[K]);{535:}MADJUSTMENT:=MWINDOW[K]-MEM[CUREDGES+3].HH.LH;
RIGHTEDGE:=8*(RIGHTCOL[K]-MADJUSTMENT);MINCOL:=LEFTCOL[K]{:535};
P:=MEM[CUREDGES].HH.RH;R:=NWINDOW[K]-(MEM[CUREDGES+1].HH.LH-4096);
WHILE(P<>CUREDGES)AND(R>=TOPROW[K])DO BEGIN IF R<BOTROW[K]THEN{532:}
BEGIN IF MEM[P+1].HH.LH>1 THEN SORTEDGES(P)ELSE IF MEM[P+1].HH.LH=1 THEN
IF ALREADYTHERE THEN GOTO 30;MEM[P+1].HH.LH:=1;{536:}N:=0;WW:=0;M:=-1;
W:=0;Q:=MEM[P+1].HH.RH;ROWTRANSITIO[0]:=MINCOL;
WHILE TRUE DO BEGIN IF Q=2500 THEN D:=RIGHTEDGE ELSE D:=0+MEM[Q].HH.LH-0
;MM:=(D DIV 8)+MADJUSTMENT;IF MM<>M THEN BEGIN{537:}
IF W<=0 THEN BEGIN IF WW>0 THEN IF M>MINCOL THEN BEGIN IF N=0 THEN IF
ALREADYTHERE THEN BEGIN B:=0;N:=N+1;END ELSE B:=1 ELSE N:=N+1;
ROWTRANSITIO[N]:=M;END;
END ELSE IF WW<=0 THEN IF M>MINCOL THEN BEGIN IF N=0 THEN B:=1;N:=N+1;
ROWTRANSITIO[N]:=M;END{:537};M:=MM;W:=WW;END;
IF D>=RIGHTEDGE THEN GOTO 40;WW:=WW+(D MOD 8)-4;Q:=MEM[Q].HH.RH;END;
40:{538:}
IF ALREADYTHERE OR(WW>0)THEN BEGIN IF N=0 THEN IF WW>0 THEN B:=1 ELSE B
:=0;N:=N+1;ROWTRANSITIO[N]:=RIGHTCOL[K];
END ELSE IF N=0 THEN GOTO 30{:538};{:536};PAINTROW(R,B,ROWTRANSITIO,N);
30:END{:532};P:=MEM[P].HH.RH;R:=R-1;END;UPDATESCREEN;
WINDOWTIME[K]:=WINDOWTIME[K]+1;MEM[CUREDGES+3].HH.RH:=K;
MEM[CUREDGES+4].INT:=WINDOWTIME[K];END;END;{:531}{544:}
FUNCTION MAXCOEF(P:HALFWORD):FRACTION;VAR X:FRACTION;BEGIN X:=0;
WHILE MEM[P].HH.LH<>0 DO BEGIN IF ABS(MEM[P+1].INT)>X THEN X:=ABS(MEM[P
+1].INT);P:=MEM[P].HH.RH;END;MAXCOEF:=X;END;{:544}{547:}
FUNCTION PPLUSFQ(P:HALFWORD;F:INTEGER;Q:HALFWORD;
T,TT:SMALLNUMBER):HALFWORD;LABEL 30;VAR PP,QQ:HALFWORD;R,S:HALFWORD;
THRESHOLD:INTEGER;V:INTEGER;
BEGIN IF T=17 THEN THRESHOLD:=2685 ELSE THRESHOLD:=8;R:=2501;
PP:=MEM[P].HH.LH;QQ:=MEM[Q].HH.LH;
WHILE TRUE DO IF PP=QQ THEN IF PP=0 THEN GOTO 30 ELSE{548:}
BEGIN IF TT=17 THEN V:=MEM[P+1].INT+TAKEFRACTION(F,MEM[Q+1].INT)ELSE V:=
MEM[P+1].INT+TAKESCALED(F,MEM[Q+1].INT);MEM[P+1].INT:=V;S:=P;
P:=MEM[P].HH.RH;
IF ABS(V)<THRESHOLD THEN FREENODE(S,2)ELSE BEGIN IF ABS(V)>=626349397
THEN IF WATCHCOEFS THEN BEGIN MEM[QQ].HH.B0:=0;FIXNEEDED:=TRUE;END;
MEM[R].HH.RH:=S;R:=S;END;PP:=MEM[P].HH.LH;Q:=MEM[Q].HH.RH;
QQ:=MEM[Q].HH.LH;END{:548}ELSE IF PP<QQ THEN{549:}
BEGIN IF TT=17 THEN V:=TAKEFRACTION(F,MEM[Q+1].INT)ELSE V:=TAKESCALED(F,
MEM[Q+1].INT);IF ABS(V)>(THRESHOLD)DIV 2 THEN BEGIN S:=GETNODE(2);
MEM[S].HH.LH:=QQ;MEM[S+1].INT:=V;
IF ABS(V)>=626349397 THEN IF WATCHCOEFS THEN BEGIN MEM[QQ].HH.B0:=0;
FIXNEEDED:=TRUE;END;MEM[R].HH.RH:=S;R:=S;END;Q:=MEM[Q].HH.RH;
QQ:=MEM[Q].HH.LH;END{:549}ELSE BEGIN MEM[R].HH.RH:=P;R:=P;
P:=MEM[P].HH.RH;PP:=MEM[P].HH.LH;END;
30:IF T=17 THEN MEM[P+1].INT:=MEM[P+1].INT+TAKEFRACTION(MEM[Q+1].INT,F)
ELSE MEM[P+1].INT:=MEM[P+1].INT+TAKESCALED(MEM[Q+1].INT,F);
MEM[R].HH.RH:=P;DEPFINAL:=P;PPLUSFQ:=MEM[2501].HH.RH;END;{:547}{550:}
FUNCTION PPLUSQ(P:HALFWORD;Q:HALFWORD;T:SMALLNUMBER):HALFWORD;LABEL 30;
VAR PP,QQ:HALFWORD;R,S:HALFWORD;THRESHOLD:INTEGER;V:INTEGER;
BEGIN IF T=17 THEN THRESHOLD:=2685 ELSE THRESHOLD:=8;R:=2501;
PP:=MEM[P].HH.LH;QQ:=MEM[Q].HH.LH;
WHILE TRUE DO IF PP=QQ THEN IF PP=0 THEN GOTO 30 ELSE{551:}
BEGIN V:=MEM[P+1].INT+MEM[Q+1].INT;MEM[P+1].INT:=V;S:=P;P:=MEM[P].HH.RH;
PP:=MEM[P].HH.LH;
IF ABS(V)<THRESHOLD THEN FREENODE(S,2)ELSE BEGIN IF ABS(V)>=626349397
THEN IF WATCHCOEFS THEN BEGIN MEM[QQ].HH.B0:=0;FIXNEEDED:=TRUE;END;
MEM[R].HH.RH:=S;R:=S;END;Q:=MEM[Q].HH.RH;QQ:=MEM[Q].HH.LH;END{:551}
ELSE IF PP<QQ THEN BEGIN S:=GETNODE(2);MEM[S].HH.LH:=QQ;
MEM[S+1].INT:=MEM[Q+1].INT;Q:=MEM[Q].HH.RH;QQ:=MEM[Q].HH.LH;
MEM[R].HH.RH:=S;R:=S;END ELSE BEGIN MEM[R].HH.RH:=P;R:=P;
P:=MEM[P].HH.RH;PP:=MEM[P].HH.LH;END;
30:MEM[P+1].INT:=MEM[P+1].INT+MEM[Q+1].INT;MEM[R].HH.RH:=P;DEPFINAL:=P;
PPLUSQ:=MEM[2501].HH.RH;END;{:550}{552:}FUNCTION PTIMESV(P:HALFWORD;
V:INTEGER;T0,T1:SMALLNUMBER;VISSCALED:BOOLEAN):HALFWORD;
VAR R,S:HALFWORD;W:INTEGER;THRESHOLD:INTEGER;SCALINGDOWN:BOOLEAN;
BEGIN IF T0<>T1 THEN SCALINGDOWN:=TRUE ELSE SCALINGDOWN:=NOT VISSCALED;
IF T1=17 THEN THRESHOLD:=1342 ELSE THRESHOLD:=4;R:=2501;
WHILE MEM[P].HH.LH<>0 DO BEGIN IF SCALINGDOWN THEN W:=TAKEFRACTION(V,MEM
[P+1].INT)ELSE W:=TAKESCALED(V,MEM[P+1].INT);
IF ABS(W)<=THRESHOLD THEN BEGIN S:=MEM[P].HH.RH;FREENODE(P,2);P:=S;
END ELSE BEGIN IF ABS(W)>=626349397 THEN BEGIN FIXNEEDED:=TRUE;
MEM[MEM[P].HH.LH].HH.B0:=0;END;MEM[R].HH.RH:=P;R:=P;MEM[P+1].INT:=W;
P:=MEM[P].HH.RH;END;END;MEM[R].HH.RH:=P;
IF VISSCALED THEN MEM[P+1].INT:=TAKESCALED(MEM[P+1].INT,V)ELSE MEM[P+1].
INT:=TAKEFRACTION(MEM[P+1].INT,V);PTIMESV:=MEM[2501].HH.RH;END;{:552}
{553:}FUNCTION POVERV(P:HALFWORD;V:SCALED;T0,T1:SMALLNUMBER):HALFWORD;
VAR R,S:HALFWORD;W:INTEGER;THRESHOLD:INTEGER;SCALINGDOWN:BOOLEAN;
BEGIN IF T0<>T1 THEN SCALINGDOWN:=TRUE ELSE SCALINGDOWN:=FALSE;
IF T1=17 THEN THRESHOLD:=1342 ELSE THRESHOLD:=4;R:=2501;
WHILE MEM[P].HH.LH<>0 DO BEGIN IF SCALINGDOWN THEN IF ABS(V)<524288 THEN
W:=MAKESCALED(MEM[P+1].INT,V*4096)ELSE W:=MAKESCALED(ROUNDFRACTIO(MEM[P
+1].INT),V)ELSE W:=MAKESCALED(MEM[P+1].INT,V);
IF ABS(W)<=THRESHOLD THEN BEGIN S:=MEM[P].HH.RH;FREENODE(P,2);P:=S;
END ELSE BEGIN IF ABS(W)>=626349397 THEN BEGIN FIXNEEDED:=TRUE;
MEM[MEM[P].HH.LH].HH.B0:=0;END;MEM[R].HH.RH:=P;R:=P;MEM[P+1].INT:=W;
P:=MEM[P].HH.RH;END;END;MEM[R].HH.RH:=P;
MEM[P+1].INT:=MAKESCALED(MEM[P+1].INT,V);POVERV:=MEM[2501].HH.RH;END;
{:553}{554:}FUNCTION PWITHXBECOMI(P,X,Q:HALFWORD;
T:SMALLNUMBER):HALFWORD;VAR R,S:HALFWORD;V:INTEGER;BEGIN S:=P;R:=2501;
WHILE MEM[S].HH.LH>X DO BEGIN R:=S;S:=MEM[S].HH.RH;END;
IF MEM[S].HH.LH<>X THEN PWITHXBECOMI:=P ELSE BEGIN MEM[2501].HH.RH:=P;
MEM[R].HH.RH:=MEM[S].HH.RH;V:=MEM[S+1].INT;FREENODE(S,2);
PWITHXBECOMI:=PPLUSFQ(MEM[2501].HH.RH,V,Q,T,17);END;END;{:554}{555:}
PROCEDURE FIXDEPENDENC;LABEL 30;VAR P,R,S:HALFWORD;X:HALFWORD;
BEGIN R:=MEM[13].HH.RH;S:=0;WHILE R<>13 DO BEGIN R:=MEM[R+1].HH.RH;
WHILE TRUE DO BEGIN X:=MEM[R].HH.LH;IF X=0 THEN GOTO 30;
IF MEM[X].HH.B0<=1 THEN BEGIN IF MEM[X].HH.B0<1 THEN BEGIN P:=GETAVAIL;
MEM[P].HH.RH:=S;S:=P;MEM[S].HH.LH:=X;MEM[X].HH.B0:=1;END;
MEM[R+1].INT:=MEM[R+1].INT DIV 4;END;R:=MEM[R].HH.RH;END;
30:R:=MEM[R].HH.RH;END;WHILE S<>0 DO BEGIN P:=MEM[S].HH.RH;
X:=MEM[S].HH.LH;BEGIN MEM[S].HH.RH:=AVAIL;AVAIL:=S;DYNUSED:=DYNUSED-1;
END;S:=P;MEM[X].HH.B0:=20;MEM[X+1].INT:=MEM[X+1].INT+2;END;END;{:555}
{556:}PROCEDURE NEWDEP(Q,P:HALFWORD);VAR R:HALFWORD;
BEGIN MEM[Q+1].HH.RH:=P;MEM[Q+1].HH.LH:=13;R:=MEM[13].HH.RH;
MEM[DEPFINAL].HH.RH:=R;MEM[R+1].HH.LH:=DEPFINAL;MEM[13].HH.RH:=Q;END;
{:556}{558:}PROCEDURE LINEAREQ(P:HALFWORD;T:SMALLNUMBER);
VAR Q,R,S:HALFWORD;X:HALFWORD;N:INTEGER;V:INTEGER;PREVR:HALFWORD;
FINALNODE:HALFWORD;W:INTEGER;BEGIN{559:}Q:=P;R:=MEM[P].HH.RH;
V:=MEM[Q+1].INT;
WHILE MEM[R].HH.LH<>0 DO BEGIN IF ABS(MEM[R+1].INT)>ABS(V)THEN BEGIN Q:=
R;V:=MEM[R+1].INT;END;R:=MEM[R].HH.RH;END{:559};X:=MEM[Q].HH.LH;
N:=MEM[X+1].INT;{560:}S:=2501;MEM[S].HH.RH:=P;R:=P;
REPEAT IF R=Q THEN BEGIN MEM[S].HH.RH:=MEM[R].HH.RH;FREENODE(R,2);
END ELSE BEGIN W:=MAKEFRACTION(MEM[R+1].INT,V);
IF ABS(W)<=1342 THEN BEGIN MEM[S].HH.RH:=MEM[R].HH.RH;FREENODE(R,2);
END ELSE BEGIN MEM[R+1].INT:=-W;S:=R;END;END;R:=MEM[S].HH.RH;
UNTIL MEM[R].HH.LH=0;
IF T=18 THEN MEM[R+1].INT:=-MAKESCALED(MEM[R+1].INT,V)ELSE IF V<>
-268435456 THEN MEM[R+1].INT:=-MAKEFRACTION(MEM[R+1].INT,V);
FINALNODE:=R;P:=MEM[2501].HH.RH{:560};IF INTERNAL[2]>0 THEN{561:}
BEGIN BEGINDIAGNOS;PRINTNL(438);PRINTVARIABL(X);W:=N;
WHILE W>0 DO BEGIN PRINT(436);W:=W-2;END;PRINTCHAR(61);
PRINTDEPENDE(P,17);ENDDIAGNOSTI(FALSE);END{:561};{562:}PREVR:=13;
R:=MEM[13].HH.RH;WHILE R<>13 DO BEGIN S:=MEM[R+1].HH.RH;
Q:=PWITHXBECOMI(S,X,P,MEM[R].HH.B0);IF MEM[Q].HH.LH=0 THEN{563:}
BEGIN MEM[R].HH.B0:=16;MEM[R+1].INT:=MEM[Q+1].INT;
IF ABS(MEM[R+1].INT)>=268435456 THEN ARITHERROR:=TRUE;
IF INTERNAL[2]>0 THEN SHOWIMPLIEDE(R);R:=MEM[Q].HH.RH;
MEM[R+1].HH.LH:=PREVR;MEM[PREVR].HH.RH:=R;FREENODE(Q,2);END{:563}
ELSE BEGIN MEM[R+1].HH.RH:=Q;REPEAT Q:=MEM[Q].HH.RH;
UNTIL MEM[Q].HH.LH=0;PREVR:=Q;R:=MEM[Q].HH.RH;END;END{:562};{564:}
IF N>0 THEN{565:}BEGIN S:=2501;MEM[2501].HH.RH:=P;R:=P;
REPEAT IF N>30 THEN W:=0 ELSE W:=MEM[R+1].INT DIV TWOTOTHE[N];
IF(ABS(W)<=1342)AND(MEM[R].HH.LH<>0)THEN BEGIN MEM[S].HH.RH:=MEM[R].HH.
RH;FREENODE(R,2);END ELSE BEGIN MEM[R+1].INT:=W;S:=R;END;
R:=MEM[S].HH.RH;UNTIL MEM[S].HH.LH=0;P:=MEM[2501].HH.RH;END{:565};
IF MEM[P].HH.LH=0 THEN BEGIN MEM[X].HH.B0:=16;
MEM[X+1].INT:=MEM[P+1].INT;
IF ABS(MEM[X+1].INT)>=268435456 THEN ARITHERROR:=TRUE;FREENODE(P,2);
END ELSE BEGIN MEM[X].HH.B0:=17;DEPFINAL:=FINALNODE;NEWDEP(X,P);
END{:564};IF FIXNEEDED THEN FIXDEPENDENC;END;{:558}{567:}
FUNCTION NEWRINGENTRY(P:HALFWORD):HALFWORD;VAR Q:HALFWORD;
BEGIN Q:=GETNODE(2);MEM[Q].HH.B1:=11;MEM[Q].HH.B0:=MEM[P].HH.B0;
IF MEM[P+1].INT=0 THEN MEM[Q+1].INT:=P ELSE MEM[Q+1].INT:=MEM[P+1].INT;
MEM[P+1].INT:=Q;NEWRINGENTRY:=Q;END;{:567}{570:}
PROCEDURE NONLINEAREQ(V:INTEGER;P:HALFWORD;FLUSHP:BOOLEAN);
VAR T:SMALLNUMBER;Q,R:HALFWORD;BEGIN T:=MEM[P].HH.B0-1;Q:=MEM[P+1].INT;
IF FLUSHP THEN MEM[P].HH.B0:=1 ELSE P:=Q;REPEAT R:=MEM[Q+1].INT;
MEM[Q].HH.B0:=T;CASE T OF 2:MEM[Q+1].INT:=V;4:BEGIN MEM[Q+1].INT:=V;
BEGIN IF STRREF[V]<127 THEN STRREF[V]:=STRREF[V]+1;END;END;
6:BEGIN MEM[Q+1].INT:=V;MEM[V].HH.LH:=MEM[V].HH.LH+1;END;
9:MEM[Q+1].INT:=COPYEDGES(V);11:MEM[Q+1].INT:=COPYPATH(V);END;Q:=R;
UNTIL Q=P;END;{:570}{571:}PROCEDURE RINGMERGE(P,Q:HALFWORD);LABEL 10;
VAR R:HALFWORD;BEGIN R:=MEM[P+1].INT;
WHILE R<>P DO BEGIN IF R=Q THEN BEGIN{572:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(439);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=440;HELPLINE[0]:=441;END;PUTGETERROR;
END{:572};GOTO 10;END;R:=MEM[R+1].INT;END;R:=MEM[P+1].INT;
MEM[P+1].INT:=MEM[Q+1].INT;MEM[Q+1].INT:=R;10:END;{:571}{576:}
PROCEDURE SHOWCMDMOD(C,M:INTEGER);BEGIN BEGINDIAGNOS;PRINTNL(123);
PRINTCMDMOD(C,M);PRINTCHAR(125);ENDDIAGNOSTI(FALSE);END;{:576}{585:}
PROCEDURE SHOWCONTEXT;LABEL 30;VAR OLDSETTING:0..5;{590:}I:0..BUFSIZE;
J:0..BUFSIZE;L:0..HALFERRORLIN;M:INTEGER;N:0..ERRORLINE;P:INTEGER;
Q:INTEGER;{:590}BEGIN FILEPTR:=INPUTPTR;INPUTSTACK[FILEPTR]:=CURINPUT;
WHILE TRUE DO BEGIN CURINPUT:=INPUTSTACK[FILEPTR];{586:}
IF(FILEPTR=INPUTPTR)OR(CURINPUT.INDEXFIELD<=6)OR(CURINPUT.INDEXFIELD<>10
)OR(CURINPUT.LOCFIELD<>0)THEN BEGIN TALLY:=0;OLDSETTING:=SELECTOR;
IF(CURINPUT.INDEXFIELD<=6)THEN BEGIN{587:}
IF CURINPUT.NAMEFIELD<=1 THEN IF(CURINPUT.NAMEFIELD=0)AND(FILEPTR=0)THEN
PRINTNL(449)ELSE PRINTNL(450)ELSE BEGIN IF PAGE>1 THEN BEGIN PRINTNL(451
);PRINTINT(PAGE);PRINT(452);END ELSE PRINTNL(453);PRINTINT(LINE);END;
PRINTCHAR(32){:587};{593:}BEGIN L:=TALLY;TALLY:=0;SELECTOR:=4;
TRICKCOUNT:=1000000;END;
IF CURINPUT.LIMITFIELD>0 THEN FOR I:=CURINPUT.STARTFIELD TO CURINPUT.
LIMITFIELD-1 DO BEGIN IF I=CURINPUT.LOCFIELD THEN BEGIN FIRSTCOUNT:=
TALLY;TRICKCOUNT:=TALLY+1+ERRORLINE-HALFERRORLIN;
IF TRICKCOUNT<ERRORLINE THEN TRICKCOUNT:=ERRORLINE;END;PRINT(BUFFER[I]);
END{:593};END ELSE BEGIN{588:}
CASE CURINPUT.INDEXFIELD OF 7:PRINTNL(454);8:PRINTNL(455);
10:IF CURINPUT.LOCFIELD=0 THEN PRINTNL(456)ELSE PRINTNL(457);
11:PRINTNL(458);12:BEGIN PRINTLN;
IF CURINPUT.NAMEFIELD<>0 THEN PRINT(HASH[CURINPUT.NAMEFIELD].RH)ELSE{589
:}BEGIN P:=PARAMSTACK[CURINPUT.LIMITFIELD];
IF P=0 THEN SHOWTOKENLIS(PARAMSTACK[CURINPUT.LIMITFIELD+1],0,1000)ELSE
BEGIN Q:=P;WHILE MEM[Q].HH.RH<>0 DO Q:=MEM[Q].HH.RH;
MEM[Q].HH.RH:=PARAMSTACK[CURINPUT.LIMITFIELD+1];SHOWTOKENLIS(P,0,1000);
MEM[Q].HH.RH:=0;END;END{:589};PRINT(357);END;9:PRINTNL(459);
OTHERS:PRINTNL(63)END{:588};{594:}BEGIN L:=TALLY;TALLY:=0;SELECTOR:=4;
TRICKCOUNT:=1000000;END;
IF CURINPUT.INDEXFIELD<>12 THEN SHOWTOKENLIS(CURINPUT.STARTFIELD,
CURINPUT.LOCFIELD,100000)ELSE SHOWMACRO(CURINPUT.STARTFIELD,CURINPUT.
LOCFIELD,100000){:594};END;SELECTOR:=OLDSETTING;{592:}
IF TRICKCOUNT=1000000 THEN BEGIN FIRSTCOUNT:=TALLY;
TRICKCOUNT:=TALLY+1+ERRORLINE-HALFERRORLIN;
IF TRICKCOUNT<ERRORLINE THEN TRICKCOUNT:=ERRORLINE;END;
IF TALLY<TRICKCOUNT THEN M:=TALLY-FIRSTCOUNT ELSE M:=TRICKCOUNT-
FIRSTCOUNT;IF L+FIRSTCOUNT<=HALFERRORLIN THEN BEGIN P:=0;
N:=L+FIRSTCOUNT;END ELSE BEGIN PRINT(148);
P:=L+FIRSTCOUNT-HALFERRORLIN+3;N:=HALFERRORLIN;END;
FOR Q:=P TO FIRSTCOUNT-1 DO PRINTCHAR(TRICKBUF[Q MOD ERRORLINE]);
PRINTLN;FOR Q:=1 TO N DO PRINTCHAR(32);
IF M+N<=ERRORLINE THEN P:=FIRSTCOUNT+M ELSE P:=FIRSTCOUNT+(ERRORLINE-N-3
);FOR Q:=FIRSTCOUNT TO P-1 DO PRINTCHAR(TRICKBUF[Q MOD ERRORLINE]);
IF M+N>ERRORLINE THEN PRINT(148){:592};END{:586};
IF(CURINPUT.INDEXFIELD<=6)THEN IF(CURINPUT.NAMEFIELD>0)OR(FILEPTR=0)THEN
GOTO 30;FILEPTR:=FILEPTR-1;END;30:CURINPUT:=INPUTSTACK[INPUTPTR];END;
{:585}{598:}PROCEDURE BEGINTOKENLI(P:HALFWORD;T:QUARTERWORD);
BEGIN BEGIN IF INPUTPTR>MAXINSTACK THEN BEGIN MAXINSTACK:=INPUTPTR;
IF INPUTPTR=STACKSIZE THEN OVERFLOW(460,STACKSIZE);END;
INPUTSTACK[INPUTPTR]:=CURINPUT;INPUTPTR:=INPUTPTR+1;END;
CURINPUT.STARTFIELD:=P;CURINPUT.INDEXFIELD:=T;
CURINPUT.LIMITFIELD:=PARAMPTR;CURINPUT.LOCFIELD:=P;END;{:598}{599:}
PROCEDURE ENDTOKENLIST;LABEL 30;VAR P:HALFWORD;
BEGIN IF CURINPUT.INDEXFIELD>=10 THEN IF CURINPUT.INDEXFIELD<=11 THEN
BEGIN FLUSHTOKENLI(CURINPUT.STARTFIELD);GOTO 30;
END ELSE DELETEMACREF(CURINPUT.STARTFIELD);
WHILE PARAMPTR>CURINPUT.LIMITFIELD DO BEGIN PARAMPTR:=PARAMPTR-1;
P:=PARAMSTACK[PARAMPTR];
IF P<>0 THEN IF MEM[P].HH.RH=1 THEN BEGIN RECYCLEVALUE(P);FREENODE(P,2);
END ELSE FLUSHTOKENLI(P);END;30:BEGIN INPUTPTR:=INPUTPTR-1;
CURINPUT:=INPUTSTACK[INPUTPTR];END;
BEGIN IF INTERRUPT<>0 THEN PAUSEFORINST;END;END;{:599}{600:}
FUNCTION CURTOK:HALFWORD;VAR P:HALFWORD;
BEGIN IF CURSYM=0 THEN BEGIN P:=GETNODE(2);MEM[P+1].INT:=CURMOD;
MEM[P].HH.LH:=CURCMD;END ELSE BEGIN P:=GETAVAIL;MEM[P].HH.LH:=CURSYM;
END;CURTOK:=P;END;{:600}{601:}PROCEDURE BACKINPUT;VAR P:HALFWORD;
S:0..150;BEGIN P:=CURTOK;
IF CURSYM<2244 THEN BEGIN WHILE(CURINPUT.INDEXFIELD>6)AND(CURINPUT.
LOCFIELD=0)DO ENDTOKENLIST;BEGINTOKENLI(P,10);
END ELSE BEGIN S:=CURINPUT.LIMITFIELD;BEGINTOKENLI(P,10);
CURINPUT.LIMITFIELD:=S;END;END;{:601}{602:}PROCEDURE BACKERROR;
BEGIN OKTOINTERRUP:=FALSE;BACKINPUT;OKTOINTERRUP:=TRUE;ERROR;END;
PROCEDURE INSERROR;BEGIN OKTOINTERRUP:=FALSE;BACKINPUT;
CURINPUT.INDEXFIELD:=11;OKTOINTERRUP:=TRUE;ERROR;END;{:602}{603:}
PROCEDURE BEGINFILEREA;BEGIN IF INOPEN=6 THEN OVERFLOW(461,6);
IF FIRST=BUFSIZE THEN OVERFLOW(128,BUFSIZE);INOPEN:=INOPEN+1;
BEGIN IF INPUTPTR>MAXINSTACK THEN BEGIN MAXINSTACK:=INPUTPTR;
IF INPUTPTR=STACKSIZE THEN OVERFLOW(460,STACKSIZE);END;
INPUTSTACK[INPUTPTR]:=CURINPUT;INPUTPTR:=INPUTPTR+1;END;
CURINPUT.INDEXFIELD:=INOPEN;LINESTACK[CURINPUT.INDEXFIELD]:=LINE;
CURINPUT.STARTFIELD:=FIRST;PAGESTACK[CURINPUT.INDEXFIELD]:=PAGE;
CURINPUT.NAMEFIELD:=0;END;{:603}{604:}PROCEDURE ENDFILEREADI;
BEGIN FIRST:=CURINPUT.STARTFIELD;PAGE:=PAGESTACK[CURINPUT.INDEXFIELD];
LINE:=LINESTACK[CURINPUT.INDEXFIELD];
IF CURINPUT.INDEXFIELD<>INOPEN THEN CONFUSION(462);
IF CURINPUT.NAMEFIELD>1 THEN ACLOSE(INPUTFILE[CURINPUT.INDEXFIELD]);
BEGIN INPUTPTR:=INPUTPTR-1;CURINPUT:=INPUTSTACK[INPUTPTR];END;
INOPEN:=INOPEN-1;END;{:604}{605:}PROCEDURE CLEARFORERRO;
BEGIN WHILE(CURINPUT.INDEXFIELD<=6)AND(CURINPUT.NAMEFIELD=0)AND(INPUTPTR
>0)AND(CURINPUT.LOCFIELD=CURINPUT.LIMITFIELD)DO ENDFILEREADI;PRINTLN;
BREAKIN(TTY,TRUE);END;{:605}{610:}FUNCTION CHECKOUTERVA:BOOLEAN;
VAR P:HALFWORD;Q:HALFWORD;
BEGIN IF SCANNERSTATU=0 THEN CHECKOUTERVA:=TRUE ELSE BEGIN DELETIONSALL
:=FALSE;{611:}IF CURSYM<>0 THEN BEGIN P:=GETAVAIL;MEM[P].HH.LH:=CURSYM;
BEGINTOKENLI(P,10);END{:611};IF SCANNERSTATU>1 THEN{612:}BEGIN RUNAWAY;
IF CURSYM=0 THEN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(468);END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(469);END;END;PRINT(470);BEGIN HELPPTR:=4;
HELPLINE[3]:=471;HELPLINE[2]:=472;HELPLINE[1]:=473;HELPLINE[0]:=474;END;
CASE SCANNERSTATU OF{613:}2:BEGIN PRINT(475);HELPLINE[3]:=476;
CURSYM:=2235;END;3:BEGIN PRINT(477);HELPLINE[3]:=478;CURSYM:=2231;
EQTB[2231].RH:=WARNINGINFO;END;4,5:BEGIN PRINT(479);
IF SCANNERSTATU=5 THEN PRINT(HASH[WARNINGINFO].RH)ELSE PRINTVARIABL(
WARNINGINFO);CURSYM:=2237;END;6:BEGIN PRINT(480);
PRINT(HASH[WARNINGINFO].RH);PRINT(481);HELPLINE[3]:=482;CURSYM:=2236;
END;{:613}END;INSERROR;END{:612}
ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(463);END;PRINTINT(WARNINGINFO);BEGIN HELPPTR:=3;HELPLINE[2]:=464;
HELPLINE[1]:=465;HELPLINE[0]:=466;END;IF CURSYM=0 THEN HELPLINE[2]:=467;
CURSYM:=2238;INSERROR;END;DELETIONSALL:=TRUE;CHECKOUTERVA:=FALSE;END;
END;{:610}{615:}PROCEDURE FIRMUPTHELIN;FORWARD;{:615}{616:}
PROCEDURE GETNEXT;LABEL 20,10,40,25,85,86,87,30;VAR K:0..BUFSIZE;
C:ASCIICODE;CLASS:ASCIICODE;N,F:INTEGER;BEGIN 20:CURSYM:=0;
IF(CURINPUT.INDEXFIELD<=6)THEN{618:}
BEGIN 25:C:=BUFFER[CURINPUT.LOCFIELD];
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;CLASS:=CHARCLASS[C];
CASE CLASS OF 0:GOTO 85;
1:BEGIN CLASS:=CHARCLASS[BUFFER[CURINPUT.LOCFIELD]];
IF CLASS>1 THEN GOTO 25 ELSE IF CLASS<1 THEN BEGIN N:=0;GOTO 86;END;END;
2:GOTO 25;3:BEGIN{627:}IF CURINPUT.NAMEFIELD>1 THEN{629:}
BEGIN LINE:=LINE+1;FIRST:=CURINPUT.STARTFIELD;
IF NOT FORCEEOF THEN BEGIN IF INPUTLN(INPUTFILE[CURINPUT.INDEXFIELD],
TRUE)THEN FIRMUPTHELIN ELSE FORCEEOF:=TRUE;END;
IF FORCEEOF THEN BEGIN PRINTCHAR(41);FORCEEOF:=FALSE;BREAK(TTY);
ENDFILEREADI;IF CHECKOUTERVA THEN GOTO 20 ELSE GOTO 20;END;
BUFFER[CURINPUT.LIMITFIELD]:=37;FIRST:=CURINPUT.LIMITFIELD+1;
CURINPUT.LOCFIELD:=CURINPUT.STARTFIELD;END{:629}
ELSE BEGIN IF NOT(CURINPUT.NAMEFIELD=0)THEN BEGIN CURCMD:=56;CURMOD:=0;
GOTO 10;END;IF INPUTPTR>0 THEN BEGIN ENDFILEREADI;GOTO 20;END;
IF SELECTOR<2 THEN OPENLOGFILE;
IF INTERACTION>1 THEN BEGIN IF CURINPUT.LIMITFIELD=CURINPUT.STARTFIELD
THEN PRINTNL(494);PRINTLN;FIRST:=CURINPUT.STARTFIELD;
BEGIN BEGIN IF INSKP0 THEN END;PRINT(42);TERMINPUT;END;
CURINPUT.LIMITFIELD:=LAST;BUFFER[CURINPUT.LIMITFIELD]:=37;
FIRST:=CURINPUT.LIMITFIELD+1;CURINPUT.LOCFIELD:=CURINPUT.STARTFIELD;
END ELSE FATALERROR(495);END{:627};
BEGIN IF INTERRUPT<>0 THEN PAUSEFORINST;END;GOTO 25;END;4:{619:}
BEGIN IF BUFFER[CURINPUT.LOCFIELD]=34 THEN CURMOD:=311 ELSE BEGIN K:=
CURINPUT.LOCFIELD;BUFFER[CURINPUT.LIMITFIELD+1]:=34;
REPEAT CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
UNTIL BUFFER[CURINPUT.LOCFIELD]=34;
IF CURINPUT.LOCFIELD>CURINPUT.LIMITFIELD THEN{620:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(487);
END;BEGIN HELPPTR:=3;HELPLINE[2]:=488;HELPLINE[1]:=489;HELPLINE[0]:=490;
END;DELETIONSALL:=FALSE;ERROR;DELETIONSALL:=TRUE;GOTO 20;END{:620};
IF CURINPUT.LOCFIELD=K+1 THEN CURMOD:=BUFFER[K]ELSE BEGIN BEGIN IF
POOLPTR+CURINPUT.LOCFIELD-K>POOLSIZE THEN OVERFLOW(129,POOLSIZE-
INITPOOLPTR);END;REPEAT BEGIN STRPOOL[POOLPTR]:=BUFFER[K];
POOLPTR:=POOLPTR+1;END;K:=K+1;UNTIL K=CURINPUT.LOCFIELD;
CURMOD:=MAKESTRING;END;END;CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
CURCMD:=40;GOTO 10;END{:619};5,6,7,8:BEGIN K:=CURINPUT.LOCFIELD-1;
GOTO 40;END;OTHERS:END;K:=CURINPUT.LOCFIELD-1;
WHILE CHARCLASS[BUFFER[CURINPUT.LOCFIELD]]=CLASS DO CURINPUT.LOCFIELD:=
CURINPUT.LOCFIELD+1;GOTO 40;85:{621:}N:=C-48;
WHILE CHARCLASSXπUFFER[CURINPUT.LOCFIELD]]=0 DO BEGIN IF N<4096 THEN N:=
10*N+BUFFER[CURINPUT.LOCFIELD]-48;
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;END;
IF BUFFER[CURINPUT.LOCFIELD]=46 THEN IF CHARCLASS[BUFFER[CURINPUT.
LOCFIELD+1]]=0 THEN GOTO 30;F:=0;GOTO 87;
30:CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1{:621};86:{622:}K:=0;
REPEAT IF K<17 THEN BEGIN DIG[K]:=BUFFER[CURINPUT.LOCFIELD]-48;K:=K+1;
END;CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
UNTIL CHARCLASS[BUFFER[CURINPUT.LOCFIELD]]<>0;F:=ROUNDDECIMAL(K){:622};
87:{623:}
IF N<4096 THEN CURMOD:=N*65536+F ELSE BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(491);END;BEGIN HELPPTR:=2;
HELPLINE[1]:=492;HELPLINE[0]:=493;END;DELETIONSALL:=FALSE;ERROR;
DELETIONSALL:=TRUE;CURMOD:=268435455;END;CURCMD:=41;GOTO 10{:623};
40:CURSYM:=IDLOOKUP(K,CURINPUT.LOCFIELD-K);END{:618}ELSE{624:}
IF CURINPUT.LOCFIELD>2500 THEN BEGIN CURSYM:=MEM[CURINPUT.LOCFIELD].HH.
LH;CURINPUT.LOCFIELD:=MEM[CURINPUT.LOCFIELD].HH.RH;
IF CURSYM>=2244 THEN IF CURSYM>=2544 THEN{625:}
BEGIN IF CURSYM>=2694 THEN CURSYM:=CURSYM-150;
BEGINTOKENLI(PARAMSTACK[CURINPUT.LIMITFIELD+CURSYM-(2544)],8);GOTO 20;
END{:625}ELSE BEGIN CURCMD:=38;
CURMOD:=PARAMSTACK[CURINPUT.LIMITFIELD+CURSYM-(2394)];GOTO 10;END;
END ELSE IF CURINPUT.LOCFIELD>0 THEN{626:}
BEGIN CURCMD:=MEM[CURINPUT.LOCFIELD].HH.LH;
CURMOD:=MEM[CURINPUT.LOCFIELD+1].INT;
IF CURCMD=40 THEN BEGIN IF STRREF[CURMOD]<127 THEN STRREF[CURMOD]:=
STRREF[CURMOD]+1;END;CURINPUT.LOCFIELD:=MEM[CURINPUT.LOCFIELD].HH.RH;
GOTO 10;END{:626}ELSE BEGIN ENDTOKENLIST;GOTO 20;END{:624};{617:}
CURCMD:=EQTB[CURSYM].LH;CURMOD:=EQTB[CURSYM].RH;
IF CURCMD>=82 THEN IF CHECKOUTERVA THEN CURCMD:=CURCMD-82 ELSE GOTO 20{:
617};10:END;{:616}{630:}PROCEDURE FIRMUPTHELIN;VAR K:0..BUFSIZE;
BEGIN CURINPUT.LIMITFIELD:=LAST;
IF INTERNAL[26]>0 THEN IF INTERACTION>1 THEN IF BUFFER[CURINPUT.
STARTFIELD]<>12 THEN BEGIN BEGIN IF INSKP0 THEN END;PRINTLN;
IF CURINPUT.STARTFIELD=CURINPUT.LIMITFIELD THEN BEGIN BUFFER[CURINPUT.
STARTFIELD]:=32;CURINPUT.LIMITFIELD:=CURINPUT.LIMITFIELD+1;END;
SELECTOR:=SELECTOR-1;
FOR K:=CURINPUT.STARTFIELD TO CURINPUT.LIMITFIELD-1 DO BEGIN PRINTCHAR(
BUFFER[K]);PTWR1W(0,ORD(XCHR[BUFFER[K]]));END;PRINT(496);
FIRST:=CURINPUT.STARTFIELD;IF NOT INPUTLN(TTY,TRUE)THEN FATALERROR(132);
IF LAST>FIRST THEN FOR K:=FIRST TO LAST-1 DO PRINTCHAR(BUFFER[K]);
CURINPUT.LIMITFIELD:=LAST;PRINTLN;SELECTOR:=SELECTOR+1;END;END;{:630}
{633:}FUNCTION SCANTOKS(TERMINATOR:COMMANDCODE;
SUBSTLIST,TAILEND:HALFWORD;SUFFIXCOUNT:SMALLNUMBER):HALFWORD;
LABEL 30,40;VAR P:HALFWORD;Q:HALFWORD;BALANCE:INTEGER;
PARAMSETTING:0..150;EXPRARGRENUM:BOOLEAN;BEGIN PARAMSETTING:=PARAMPTR;
EXPRARGRENUM:=FALSE;P:=2501;BALANCE:=1;MEM[2501].HH.RH:=0;
WHILE TRUE DO BEGIN GETNEXT;IF CURCMD=TERMINATOR THEN{637:}
IF CURMOD>0 THEN BALANCE:=BALANCE+1 ELSE BEGIN BALANCE:=BALANCE-1;
IF BALANCE=0 THEN GOTO 30;END{:637}ELSE IF CURCMD=61 THEN{640:}
BEGIN IF CURMOD=0 THEN GETNEXT ELSE IF CURMOD<=SUFFIXCOUNT THEN CURSYM:=
2543+CURMOD;END{:640}ELSE IF CURSYM>0 THEN IF CURSYM>=2244 THEN{635:}
IF TERMINATOR<>4 THEN BEGIN IF MEM[CURMOD].HH.B0=4 THEN BEGIN CURCMD:=40
;CURMOD:=MEM[CURMOD+1].INT;
BEGIN IF STRREF[CURMOD]<127 THEN STRREF[CURMOD]:=STRREF[CURMOD]+1;END;
END ELSE BEGIN IF MEM[CURMOD].HH.B0=16 THEN CURMOD:=MEM[CURMOD+1].INT
ELSE BEGIN DISPERR(CURMOD,505);BEGIN HELPPTR:=2;HELPLINE[1]:=506;
HELPLINE[0]:=507;END;ERROR;CURMOD:=0;END;CURCMD:=41;END;CURSYM:=0;
END ELSE BEGIN EXPRARGRENUM:=TRUE;
CURSYM:=CURSYM+CURINPUT.LIMITFIELD-PARAMPTR;END{:635}ELSE{634:}
BEGIN Q:=SUBSTLIST;
WHILE Q<>0 DO BEGIN IF MEM[Q].HH.LH=CURSYM THEN BEGIN CURSYM:=MEM[Q+1].
INT;GOTO 40;END;Q:=MEM[Q].HH.RH;END;40:END{:634};MEM[P].HH.RH:=CURTOK;
P:=MEM[P].HH.RH;END;30:MEM[P].HH.RH:=TAILEND;FLUSHNODELIS(SUBSTLIST);
IF EXPRARGRENUM THEN{636:}
IF(CURINPUT.INDEXFIELD<=6)OR(PARAMPTR<>PARAMSETTING)THEN FATALERROR(508)
ELSE IF CURINPUT.LOCFIELD=0 THEN CURINPUT.LOCFIELD:=2503{:636};
SCANTOKS:=MEM[2501].HH.RH;END;{:633}{641:}PROCEDURE GETSYMBOL;LABEL 20;
BEGIN 20:GETNEXT;
IF(CURSYM=0)OR(CURSYM>2229)THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(512);END;BEGIN HELPPTR:=3;
HELPLINE[2]:=513;HELPLINE[1]:=514;HELPLINE[0]:=515;END;
IF CURSYM=0 THEN BACKINPUT;CURSYM:=2229;INSERROR;GOTO 20;END;END;{:641}
{642:}PROCEDURE GETCLEARSYMB;BEGIN GETSYMBOL;CLEARSYMBOL(CURSYM,FALSE);
END;{:642}{643:}PROCEDURE CHECKEQUALS;
BEGIN IF CURCMD<>50 THEN BEGIN MISSINGERR(61);BEGIN HELPPTR:=5;
HELPLINE[4]:=516;HELPLINE[3]:=517;HELPLINE[2]:=518;HELPLINE[1]:=519;
HELPLINE[0]:=520;END;BACKERROR;END;END;{:643}{644:}PROCEDURE MAKEOPDEF;
VAR M:COMMANDCODE;P,Q,R:HALFWORD;BEGIN M:=CURMOD;GETSYMBOL;
P:=GETNODE(2);MEM[P].HH.LH:=CURSYM;MEM[P+1].INT:=2394;GETCLEARSYMB;
WARNINGINFO:=CURSYM;GETSYMBOL;Q:=GETNODE(2);MEM[Q].HH.LH:=CURSYM;
MEM[Q+1].INT:=2395;MEM[P].HH.RH:=Q;GETNEXT;CHECKEQUALS;SCANNERSTATU:=5;
Q:=GETAVAIL;MEM[Q].HH.LH:=0;R:=GETAVAIL;MEM[Q].HH.RH:=R;MEM[R].HH.LH:=0;
MEM[R].HH.RH:=SCANTOKS(14,P,0,0);SCANNERSTATU:=0;
EQTB[WARNINGINFO].LH:=M;EQTB[WARNINGINFO].RH:=Q;GETNEXT;END;{:644}{647:}
{965:}PROCEDURE CHECKDELIMIT(LDELIM,RDELIM:HALFWORD);LABEL 10;
BEGIN IF CURCMD=62 THEN IF CURMOD=LDELIM THEN GOTO 10;
IF CURSYM<>RDELIM THEN BEGIN MISSINGERR(HASH[RDELIM].RH);
BEGIN HELPPTR:=2;HELPLINE[1]:=768;HELPLINE[0]:=769;END;BACKERROR;
END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(770);END;PRINT(HASH[RDELIM].RH);PRINT(771);BEGIN HELPPTR:=3;
HELPLINE[2]:=772;HELPLINE[1]:=773;HELPLINE[0]:=774;END;ERROR;END;10:END;
{:965}{945:}FUNCTION SCANDECLARED:HALFWORD;LABEL 30;VAR X:HALFWORD;
H,T:HALFWORD;L:HALFWORD;BEGIN GETSYMBOL;X:=CURSYM;
IF CURCMD<>39 THEN CLEARSYMBOL(X,FALSE);IF EQTB[X].RH=0 THEN NEWROOT(X);
H:=GETAVAIL;MEM[H].HH.LH:=X;T:=H;WHILE TRUE DO BEGIN GETNEXT;
IF CURSYM=0 THEN GOTO 30;IF CURCMD<>39 THEN IF CURCMD=52 THEN{946:}
BEGIN L:=CURSYM;GETNEXT;IF CURCMD<>63 THEN BEGIN BACKINPUT;CURSYM:=L;
CURCMD:=52;GOTO 30;END ELSE CURSYM:=0;END{:946}ELSE GOTO 30;
MEM[T].HH.RH:=GETAVAIL;T:=MEM[T].HH.RH;MEM[T].HH.LH:=CURSYM;END;
30:SCANDECLARED:=H;END;{:945}PROCEDURE SCANDEF;VAR M:1..2;N:0..3;
K:0..150;C:0..5;R:HALFWORD;Q:HALFWORD;P:HALFWORD;BASE:HALFWORD;
LDELIM,RDELIM:HALFWORD;BEGIN M:=CURMOD;C:=0;MEM[2501].HH.RH:=0;
Q:=GETAVAIL;MEM[Q].HH.LH:=0;R:=0;{649:}IF M=1 THEN BEGIN GETCLEARSYMB;
WARNINGINFO:=CURSYM;GETNEXT;SCANNERSTATU:=5;N:=0;
EQTB[WARNINGINFO].LH:=8;EQTB[WARNINGINFO].RH:=Q;
END ELSE BEGIN P:=SCANDECLARED;
FLUSHVARIABL(EQTB[MEM[P].HH.LH].RH,MEM[P].HH.RH,TRUE);
WARNINGINFO:=FINDVARIABLE(P);FLUSHLIST(P);IF WARNINGINFO=0 THEN{650:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(527);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=528;HELPLINE[0]:=529;END;ERROR;
WARNINGINFO:=26;END{:650};SCANNERSTATU:=4;N:=2;
IF CURCMD=61 THEN IF CURMOD=3 THEN BEGIN N:=3;GETNEXT;END;
MEM[WARNINGINFO].HH.B0:=21+N;MEM[WARNINGINFO+1].INT:=Q;END{:649};K:=N;
IF CURCMD=30 THEN{652:}REPEAT LDELIM:=CURSYM;RDELIM:=CURMOD;GETNEXT;
IF(CURCMD=57)AND(CURMOD>=2394)THEN BASE:=CURMOD ELSE BEGIN BEGIN IF
INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(530);END;
BEGIN HELPPTR:=1;HELPLINE[0]:=531;END;BACKERROR;BASE:=2394;END;{653:}
REPEAT MEM[Q].HH.RH:=GETAVAIL;Q:=MEM[Q].HH.RH;MEM[Q].HH.LH:=BASE+K;
GETSYMBOL;P:=GETNODE(2);MEM[P+1].INT:=BASE+K;MEM[P].HH.LH:=CURSYM;
IF K=150 THEN OVERFLOW(532,150);K:=K+1;MEM[P].HH.RH:=R;R:=P;GETNEXT;
UNTIL CURCMD<>78{:653};CHECKDELIMIT(LDELIM,RDELIM);GETNEXT;
UNTIL CURCMD<>30{:652}ELSE IF CURCMD=57 THEN{654:}
IF CURMOD<=2394 THEN BEGIN P:=GETNODE(2);MEM[P+1].INT:=2394+N;
IF CURMOD<2394 THEN C:=CURMOD ELSE C:=4;GETSYMBOL;MEM[P].HH.LH:=CURSYM;
MEM[P].HH.RH:=R;R:=P;GETNEXT;IF C=4 THEN IF CURCMD=67 THEN BEGIN C:=5;
P:=GETNODE(2);MEM[P+1].INT:=2395+N;GETSYMBOL;MEM[P].HH.LH:=CURSYM;
MEM[P].HH.RH:=R;R:=P;GETNEXT;END;END{:654};CHECKEQUALS;P:=GETAVAIL;
MEM[P].HH.LH:=C;MEM[Q].HH.RH:=P;{648:}
IF M=1 THEN MEM[P].HH.RH:=SCANTOKS(14,R,0,N)ELSE BEGIN Q:=GETAVAIL;
MEM[Q].HH.LH:=2240;MEM[P].HH.RH:=Q;P:=GETAVAIL;MEM[P].HH.LH:=2241;
MEM[Q].HH.RH:=SCANTOKS(14,R,P,N);END{:648};SCANNERSTATU:=0;GETNEXT;END;
{:647}{655:}PROCEDURE READTOKS;VAR M:HALFWORD;P:HALFWORD;Q:HALFWORD;
BEGIN GETCLEARSYMB;M:=CURSYM;IF INTERACTION<=1 THEN FATALERROR(533);
BEGINFILEREA;CURINPUT.NAMEFIELD:=1;BEGIN BEGIN IF INSKP0 THEN END;
PRINT(311);TERMINPUT;END;CURINPUT.LIMITFIELD:=LAST;
BUFFER[CURINPUT.LIMITFIELD]:=37;FIRST:=CURINPUT.LIMITFIELD+1;
CURINPUT.LOCFIELD:=CURINPUT.STARTFIELD;P:=GETAVAIL;MEM[P].HH.LH:=0;
Q:=GETAVAIL;MEM[P].HH.RH:=Q;MEM[Q].HH.LH:=0;
MEM[Q].HH.RH:=SCANTOKS(56,0,0,0);EQTB[M].LH:=8;EQTB[M].RH:=P;
ENDFILEREADI;GETNEXT;END;{:655}{656:}PROCEDURE SCANPRIMARY;FORWARD;
PROCEDURE SCANSECONDAR;FORWARD;PROCEDURE SCANTERTIARY;FORWARD;
PROCEDURE SCANEXPRESSI;FORWARD;PROCEDURE SCANSUFFIX;FORWARD;{667:}{669:}
PROCEDURE PRINTMACRONA(A,N:HALFWORD);VAR P,Q:HALFWORD;
BEGIN IF N<>0 THEN PRINT(HASH[N].RH)ELSE BEGIN P:=MEM[A].HH.LH;
IF P=0 THEN PRINT(HASH[MEM[MEM[MEM[A].HH.RH].HH.LH].HH.LH].RH)ELSE BEGIN
Q:=P;WHILE MEM[Q].HH.RH<>0 DO Q:=MEM[Q].HH.RH;
MEM[Q].HH.RH:=MEM[MEM[A].HH.RH].HH.LH;SHOWTOKENLIS(P,0,1000);
MEM[Q].HH.RH:=0;END;END;END;{:669}{670:}PROCEDURE PRINTARG(Q:HALFWORD;
N:INTEGER;B:HALFWORD);
BEGIN IF MEM[Q].HH.RH=1 THEN PRINTNL(354)ELSE IF B<2694 THEN PRINTNL(355
)ELSE PRINTNL(356);PRINTINT(N);PRINT(546);
IF MEM[Q].HH.RH=1 THEN PRINTEXP(Q,1)ELSE SHOWTOKENLIS(Q,0,1000);END;
{:670}PROCEDURE MACROCALL(DEFREF,ARGLIST,MACRONAME:HALFWORD);
LABEL 40,30;VAR R:HALFWORD;P,Q:HALFWORD;N:INTEGER;
LDELIM,RDELIM:HALFWORD;BALANCE:INTEGER;TAIL:HALFWORD;
PARAMSETTING:0..150;EXPRARGRENUM:BOOLEAN;BEGIN R:=MEM[DEFREF].HH.RH;
MEM[DEFREF].HH.LH:=MEM[DEFREF].HH.LH+1;IF INTERNAL[7]>0 THEN{668:}
BEGIN BEGINDIAGNOS;PRINTLN;PRINTMACRONA(ARGLIST,MACRONAME);
SHOWMACRO(DEFREF,0,1000);IF ARGLIST<>0 THEN BEGIN N:=0;P:=ARGLIST;
REPEAT Q:=MEM[P].HH.LH;PRINTARG(Q,N,0);N:=N+1;P:=MEM[P].HH.RH;UNTIL P=0;
END;ENDDIAGNOSTI(FALSE);END{:668};IF ARGLIST=0 THEN N:=0 ELSE{671:}
BEGIN N:=1;TAIL:=ARGLIST;WHILE MEM[TAIL].HH.RH<>0 DO BEGIN N:=N+1;
TAIL:=MEM[TAIL].HH.RH;END;END{:671};{672:}CURCMD:=79;
WHILE MEM[R].HH.LH>=2394 DO BEGIN{673:}
IF CURCMD<>78 THEN BEGIN GETXNEXT;
IF CURCMD<>30 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(552);END;PRINTMACRONA(ARGLIST,MACRONAME);
BEGIN HELPPTR:=3;HELPLINE[2]:=553;HELPLINE[1]:=554;HELPLINE[0]:=555;END;
IF MEM[R].HH.LH>=2544 THEN BEGIN CUREXP:=0;CURTYPE:=21;
END ELSE BEGIN CUREXP:=0;CURTYPE:=16;END;BACKERROR;CURCMD:=62;GOTO 40;
END;LDELIM:=CURSYM;RDELIM:=CURMOD;END;{676:}
IF MEM[R].HH.LH>=2694 THEN{677:}BEGIN WARNINGINFO:=LDELIM;
SCANNERSTATU:=3;PARAMSETTING:=PARAMPTR;EXPRARGRENUM:=FALSE;P:=2501;
BALANCE:=1;MEM[2501].HH.RH:=0;WHILE TRUE DO BEGIN GETNEXT;
IF CURSYM>=2244 THEN{679:}
IF MEM[CURMOD].HH.B0=4 THEN BEGIN CURMOD:=MEM[CURMOD+1].INT;CURCMD:=40;
CURSYM:=0;
BEGIN IF STRREF[CURMOD]<127 THEN STRREF[CURMOD]:=STRREF[CURMOD]+1;END;
END ELSE IF(MEM[CURMOD].HH.B0<>16)AND(MEM[MEM[R].HH.RH].HH.LH=0)THEN
BEGIN EXPRARGRENUM:=TRUE;
CURSYM:=CURSYM+CURINPUT.LIMITFIELD-PARAMPTR-N-1;END ELSE{680:}
BEGIN IF MEM[CURMOD].HH.B0=16 THEN CURMOD:=MEM[CURMOD+1].INT ELSE BEGIN
DISPERR(CURMOD,559);BEGIN HELPPTR:=3;HELPLINE[2]:=560;HELPLINE[1]:=561;
HELPLINE[0]:=562;END;ERROR;CURMOD:=0;END;CURSYM:=0;CURCMD:=41;END{:680}
{:679}ELSE IF CURCMD=62 THEN BEGIN IF CURMOD=LDELIM THEN BEGIN BALANCE:=
BALANCE-1;IF BALANCE=0 THEN GOTO 30;END;
END ELSE IF CURCMD=30 THEN IF CURMOD=RDELIM THEN BALANCE:=BALANCE+1;
MEM[P].HH.RH:=CURTOK;P:=MEM[P].HH.RH;END;30:CUREXP:=MEM[2501].HH.RH;
CURTYPE:=21;SCANNERSTATU:=0;IF EXPRARGRENUM THEN{681:}
IF(CURINPUT.INDEXFIELD<=6)OR(PARAMPTR<>PARAMSETTING)THEN FATALERROR(563)
ELSE IF CURINPUT.LOCFIELD=0 THEN CURINPUT.LOCFIELD:=2503{:681};END{:677}
ELSE BEGIN GETXNEXT;
IF MEM[R].HH.LH>=2544 THEN SCANSUFFIX ELSE SCANEXPRESSI;END{:676};
IF CURCMD<>78 THEN{674:}
IF(CURCMD<>62)OR(CURMOD<>LDELIM)THEN IF MEM[MEM[R].HH.RH].HH.LH>=2394
THEN BEGIN MISSINGERR(44);BEGIN HELPPTR:=3;HELPLINE[2]:=556;
HELPLINE[1]:=557;HELPLINE[0]:=551;END;BACKERROR;CURCMD:=78;
END ELSE BEGIN MISSINGERR(HASH[RDELIM].RH);BEGIN HELPPTR:=2;
HELPLINE[1]:=558;HELPLINE[0]:=551;END;BACKERROR;END{:674};40:{675:}
BEGIN P:=GETAVAIL;
IF CURTYPE=21 THEN MEM[P].HH.LH:=CUREXP ELSE MEM[P].HH.LH:=STASHCUREXP;
IF INTERNAL[7]>0 THEN BEGIN BEGINDIAGNOS;
PRINTARG(MEM[P].HH.LH,N,MEM[R].HH.LH);ENDDIAGNOSTI(FALSE);END;
IF ARGLIST=0 THEN ARGLIST:=P ELSE MEM[TAIL].HH.RH:=P;TAIL:=P;N:=N+1;
END{:675}{:673};R:=MEM[R].HH.RH;END;
IF CURCMD=78 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(547);END;PRINTMACRONA(ARGLIST,MACRONAME);
PRINTCHAR(59);PRINTNL(548);PRINT(HASH[RDELIM].RH);PRINT(171);
BEGIN HELPPTR:=3;HELPLINE[2]:=549;HELPLINE[1]:=550;HELPLINE[0]:=551;END;
ERROR;END;IF MEM[R].HH.LH<>0 THEN{682:}BEGIN GETXNEXT;
CASE MEM[R].HH.LH OF 1:SCANPRIMARY;2:SCANSECONDAR;3:SCANTERTIARY;
4:SCANEXPRESSI;5:BEGIN SCANEXPRESSI;P:=GETAVAIL;
MEM[P].HH.LH:=STASHCUREXP;IF INTERNAL[7]>0 THEN BEGIN BEGINDIAGNOS;
PRINTARG(MEM[P].HH.LH,N,0);ENDDIAGNOSTI(FALSE);END;
IF ARGLIST=0 THEN ARGLIST:=P ELSE MEM[TAIL].HH.RH:=P;TAIL:=P;N:=N+1;
IF CURCMD<>67 THEN BEGIN MISSINGERR(337);PRINT(564);
PRINTMACRONA(ARGLIST,MACRONAME);BEGIN HELPPTR:=1;HELPLINE[0]:=565;END;
BACKERROR;END;GETXNEXT;SCANPRIMARY;END;END;BACKINPUT;{675:}
BEGIN P:=GETAVAIL;
IF CURTYPE=21 THEN MEM[P].HH.LH:=CUREXP ELSE MEM[P].HH.LH:=STASHCUREXP;
IF INTERNAL[7]>0 THEN BEGIN BEGINDIAGNOS;
PRINTARG(MEM[P].HH.LH,N,MEM[R].HH.LH);ENDDIAGNOSTI(FALSE);END;
IF ARGLIST=0 THEN ARGLIST:=P ELSE MEM[TAIL].HH.RH:=P;TAIL:=P;N:=N+1;
END{:675};END{:682};R:=MEM[R].HH.RH{:672};{683:}
WHILE(CURINPUT.INDEXFIELD>6)AND(CURINPUT.LOCFIELD=0)DO ENDTOKENLIST;
IF PARAMPTR+N>MAXPARAMSTAC THEN BEGIN MAXPARAMSTAC:=PARAMPTR+N;
IF MAXPARAMSTAC>150 THEN OVERFLOW(532,150);END;BEGINTOKENLI(DEFREF,12);
CURINPUT.NAMEFIELD:=MACRONAME;CURINPUT.LOCFIELD:=R;
IF N>0 THEN BEGIN P:=ARGLIST;REPEAT PARAMSTACK[PARAMPTR]:=MEM[P].HH.LH;
PARAMPTR:=PARAMPTR+1;P:=MEM[P].HH.RH;UNTIL P=0;FLUSHLIST(ARGLIST);
END{:683};END;{:667}PROCEDURE GETBOOLEAN;FORWARD;PROCEDURE PASSTEXT;
FORWARD;PROCEDURE CONDITIONAL;FORWARD;PROCEDURE STARTINPUT;FORWARD;
PROCEDURE BEGINITERATI;FORWARD;PROCEDURE RESUMEITERAT;FORWARD;
PROCEDURE STOPITERATIO;FORWARD;{:656}{657:}PROCEDURE GETXNEXT;
VAR P:HALFWORD;SAVEEXP:HALFWORD;BEGIN GETNEXT;
IF CURCMD<9 THEN BEGIN SAVEEXP:=STASHCUREXP;REPEAT{658:}
BEGIN IF INTERNAL[6]>65536 THEN IF CURCMD<>8 THEN SHOWCMDMOD(CURCMD,
CURMOD);CASE CURCMD OF 1:CONDITIONAL;2:{698:}
IF CURMOD>IFLIMIT THEN IF IFLIMIT=1 THEN BEGIN MISSINGERR(58);BACKINPUT;
CURSYM:=2234;INSERROR;
END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(572);END;PRINTCMDMOD(2,CURMOD);BEGIN HELPPTR:=1;HELPLINE[0]:=573;
END;ERROR;END ELSE BEGIN WHILE CURMOD<>2 DO PASSTEXT;{692:}
BEGIN P:=CONDPTR;IFLINE:=MEM[P+1].INT;CURIF:=MEM[P].HH.B1;
IFLIMIT:=MEM[P].HH.B0;CONDPTR:=MEM[P].HH.RH;FREENODE(P,2);END{:692};
END{:698};3:{662:}IF CURMOD>0 THEN FORCEEOF:=TRUE ELSE STARTINPUT{:662};
4:IF CURMOD=0 THEN{659:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(534);END;BEGIN HELPPTR:=2;HELPLINE[1]:=535;
HELPLINE[0]:=536;END;ERROR;END{:659}ELSE BEGINITERATI;5:{663:}
BEGIN WHILE(CURINPUT.INDEXFIELD>6)AND(CURINPUT.LOCFIELD=0)DO
ENDTOKENLIST;
IF LOOPPTR=0 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(538);END;BEGIN HELPPTR:=2;HELPLINE[1]:=539;
HELPLINE[0]:=540;END;ERROR;END ELSE RESUMEITERAT;END{:663};6:{664:}
BEGIN GETBOOLEAN;IF INTERNAL[6]>65536 THEN SHOWCMDMOD(32,CUREXP);
IF CUREXP=30 THEN IF LOOPPTR=0 THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(541);END;BEGIN HELPPTR:=1;
HELPLINE[0]:=542;END;IF CURCMD=79 THEN ERROR ELSE BACKERROR;
END ELSE{665:}BEGIN P:=0;
REPEAT IF(CURINPUT.INDEXFIELD<=6)THEN ENDFILEREADI ELSE BEGIN IF
CURINPUT.INDEXFIELD=7 THEN P:=CURINPUT.STARTFIELD;ENDTOKENLIST;END;
UNTIL P<>0;IF P<>MEM[LOOPPTR].HH.LH THEN FATALERROR(545);STOPITERATIO;
END{:665}ELSE IF CURCMD<>79 THEN BEGIN MISSINGERR(59);BEGIN HELPPTR:=2;
HELPLINE[1]:=543;HELPLINE[0]:=544;END;BACKERROR;END;END{:664};7:;
8:MACROCALL(CURMOD,0,CURSYM);END;END{:658};GETNEXT;UNTIL CURCMD>=9;
UNSTASHCUREX(SAVEEXP);END;END;{:657}{684:}
PROCEDURE STACKARGUMEN(P:HALFWORD);
BEGIN IF PARAMPTR=MAXPARAMSTAC THEN BEGIN MAXPARAMSTAC:=MAXPARAMSTAC+1;
IF MAXPARAMSTAC>150 THEN OVERFLOW(532,150);END;PARAMSTACK[PARAMPTR]:=P;
PARAMPTR:=PARAMPTR+1;END;{:684}{689:}PROCEDURE PASSTEXT;LABEL 30;
VAR L:INTEGER;BEGIN SCANNERSTATU:=1;L:=0;WARNINGINFO:=LINE;
WHILE TRUE DO BEGIN GETNEXT;
IF CURCMD<=2 THEN IF CURCMD<2 THEN L:=L+1 ELSE BEGIN IF L=0 THEN GOTO 30
;IF CURMOD=2 THEN L:=L-1;END ELSE{690:}
IF CURCMD=40 THEN BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1
THEN STRREF[CURMOD]:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END{:690}
;END;30:SCANNERSTATU:=0;END;{:689}{693:}
PROCEDURE CHANGEIFLIMI(L:SMALLNUMBER;P:HALFWORD);LABEL 10;
VAR Q:HALFWORD;BEGIN IF P=CONDPTR THEN IFLIMIT:=L ELSE BEGIN Q:=CONDPTR;
WHILE TRUE DO BEGIN IF Q=0 THEN CONFUSION(566);
IF MEM[Q].HH.RH=P THEN BEGIN MEM[Q].HH.B0:=L;GOTO 10;END;
Q:=MEM[Q].HH.RH;END;END;10:END;{:693}{694:}PROCEDURE CHECKCOLON;
BEGIN IF CURCMD<>77 THEN BEGIN MISSINGERR(58);BEGIN HELPPTR:=2;
HELPLINE[1]:=569;HELPLINE[0]:=544;END;BACKERROR;END;END;{:694}{695:}
PROCEDURE CONDITIONAL;LABEL 10,30,21,40;VAR SAVECONDPTR:HALFWORD;
P:HALFWORD;BEGIN{691:}BEGIN P:=GETNODE(2);MEM[P].HH.RH:=CONDPTR;
MEM[P].HH.B0:=IFLIMIT;MEM[P].HH.B1:=CURIF;MEM[P+1].INT:=IFLINE;
CONDPTR:=P;IFLIMIT:=1;IFLINE:=LINE;END{:691};SAVECONDPTR:=CONDPTR;
21:CURIF:=CURMOD;GETBOOLEAN;IF INTERNAL[6]>65536 THEN{697:}
BEGIN BEGINDIAGNOS;IF CUREXP=30 THEN PRINT(570)ELSE PRINT(571);
ENDDIAGNOSTI(FALSE);END{:697};40:CHECKCOLON;
IF CUREXP=30 THEN BEGIN CHANGEIFLIMI(4,SAVECONDPTR);GOTO 10;END;{696:}
WHILE TRUE DO BEGIN PASSTEXT;
IF CONDPTR=SAVECONDPTR THEN GOTO 30 ELSE IF CURMOD=2 THEN{692:}
BEGIN P:=CONDPTR;IFLINE:=MEM[P+1].INT;CURIF:=MEM[P].HH.B1;
IFLIMIT:=MEM[P].HH.B0;CONDPTR:=MEM[P].HH.RH;FREENODE(P,2);END{:692};
END{:696};30:IF CURMOD=2 THEN{692:}BEGIN P:=CONDPTR;
IFLINE:=MEM[P+1].INT;CURIF:=MEM[P].HH.B1;IFLIMIT:=MEM[P].HH.B0;
CONDPTR:=MEM[P].HH.RH;FREENODE(P,2);END{:692}
ELSE IF CURMOD=4 THEN GOTO 21 ELSE BEGIN CUREXP:=30;IFLIMIT:=2;GETXNEXT;
GOTO 40;END;10:END;{:695}{700:}PROCEDURE BADFOR(S:STRNUMBER);
BEGIN DISPERR(0,574);PRINT(S);PRINT(178);BEGIN HELPPTR:=4;
HELPLINE[3]:=575;HELPLINE[2]:=576;HELPLINE[1]:=577;HELPLINE[0]:=180;END;
PUTGETFLUSHE(0);END;{:700}{701:}PROCEDURE BEGINITERATI;LABEL 30,40;
VAR M:HALFWORD;N:HALFWORD;P,Q,S,PP:HALFWORD;BEGIN M:=CURMOD;N:=CURSYM;
S:=GETNODE(2);IF M=1 THEN BEGIN MEM[S+1].HH.LH:=1;P:=0;GETNEXT;GOTO 40;
END;GETSYMBOL;P:=GETNODE(2);MEM[P].HH.LH:=CURSYM;MEM[P+1].INT:=M;
GETNEXT;IF(CURCMD<>50)AND(CURCMD<>76)THEN BEGIN MISSINGERR(61);
BEGIN HELPPTR:=3;HELPLINE[2]:=578;HELPLINE[1]:=518;HELPLINE[0]:=579;END;
BACKERROR;END;{710:}Q:=S+1;REPEAT GETXNEXT;
IF M<>2394 THEN SCANSUFFIX ELSE BEGIN SCANEXPRESSI;
IF CURCMD=73 THEN IF Q=S+1 THEN{711:}
BEGIN IF CURTYPE<>16 THEN BADFOR(585);PP:=GETNODE(4);
MEM[PP+1].INT:=CUREXP;GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>16 THEN BADFOR(586);MEM[PP+2].INT:=CUREXP;
IF CURCMD<>74 THEN BEGIN MISSINGERR(347);BEGIN HELPPTR:=2;
HELPLINE[1]:=587;HELPLINE[0]:=588;END;BACKERROR;END;GETXNEXT;
SCANEXPRESSI;IF CURTYPE<>16 THEN BADFOR(589);MEM[PP+3].INT:=CUREXP;
MEM[S+1].HH.LH:=PP;GOTO 30;END{:711};CUREXP:=STASHCUREXP;END;
MEM[Q].HH.RH:=GETAVAIL;Q:=MEM[Q].HH.RH;MEM[Q].HH.LH:=CUREXP;CURTYPE:=1;
UNTIL CURCMD<>78;MEM[S+1].HH.LH:=0;30:{:710};40:{702:}
IF CURCMD<>77 THEN BEGIN MISSINGERR(58);BEGIN HELPPTR:=3;
HELPLINE[2]:=580;HELPLINE[1]:=581;HELPLINE[0]:=582;END;BACKERROR;
END{:702};{704:}Q:=GETAVAIL;MEM[Q].HH.LH:=2230;SCANNERSTATU:=6;
WARNINGINFO:=N;MEM[S].HH.LH:=SCANTOKS(4,P,Q,0);SCANNERSTATU:=0;
MEM[S].HH.RH:=LOOPPTR;LOOPPTR:=S{:704};RESUMEITERAT;END;{:701}{706:}
PROCEDURE RESUMEITERAT;LABEL 45,10;VAR P,Q:HALFWORD;
BEGIN P:=MEM[LOOPPTR+1].HH.LH;IF P>1 THEN BEGIN CUREXP:=MEM[P+1].INT;
IF{707:}
((MEM[P+2].INT>0)AND(CUREXP>MEM[P+3].INT))OR((MEM[P+2].INT<0)AND(CUREXP<
MEM[P+3].INT)){:707}THEN GOTO 45;CURTYPE:=16;Q:=STASHCUREXP;
MEM[P+1].INT:=CUREXP+MEM[P+2].INT;
END ELSE IF P<1 THEN BEGIN P:=MEM[LOOPPTR+1].HH.RH;IF P=0 THEN GOTO 45;
MEM[LOOPPTR+1].HH.RH:=MEM[P].HH.RH;Q:=MEM[P].HH.LH;
BEGIN MEM[P].HH.RH:=AVAIL;AVAIL:=P;DYNUSED:=DYNUSED-1;END;END;
BEGINTOKENLI(MEM[LOOPPTR].HH.LH,7);IF P<>1 THEN STACKARGUMEN(Q);
IF INTERNAL[6]>65536 THEN{708:}IF P<>1 THEN BEGIN BEGINDIAGNOS;
PRINTNL(584);
IF(Q<>0)AND(MEM[Q].HH.RH=1)THEN PRINTEXP(Q,1)ELSE SHOWTOKENLIS(Q,0,50);
PRINTCHAR(125);ENDDIAGNOSTI(FALSE);END{:708};GOTO 10;45:STOPITERATIO;
10:END;{:706}{709:}PROCEDURE STOPITERATIO;VAR P,Q:HALFWORD;
BEGIN P:=MEM[LOOPPTR+1].HH.LH;
IF P>1 THEN FREENODE(P,4)ELSE IF P<1 THEN BEGIN Q:=MEM[LOOPPTR+1].HH.RH;
WHILE Q<>0 DO BEGIN P:=MEM[Q].HH.LH;
IF P<>0 THEN IF MEM[P].HH.RH=1 THEN BEGIN RECYCLEVALUE(P);FREENODE(P,2);
END ELSE FLUSHTOKENLI(P);P:=Q;Q:=MEM[Q].HH.RH;BEGIN MEM[P].HH.RH:=AVAIL;
AVAIL:=P;DYNUSED:=DYNUSED-1;END;END;END;P:=LOOPPTR;
LOOPPTR:=MEM[P].HH.RH;FLUSHTOKENLI(MEM[P].HH.LH);FREENODE(P,2);END;
{:709}{716:}PROCEDURE BEGINNAME;BEGIN AREADELIMITE:=0;EXTDELIMITER:=0;
END;{:716}{717:}FUNCTION MORENAME(C:ASCIICODE):BOOLEAN;
BEGIN IF C=32 THEN MORENAME:=FALSE ELSE BEGIN IF C=91 THEN AREADELIMITE
:=POOLPTR ELSE IF C=46 THEN EXTDELIMITER:=POOLPTR;
BEGIN IF POOLPTR+1>POOLSIZE THEN OVERFLOW(129,POOLSIZE-INITPOOLPTR);END;
BEGIN STRPOOL[POOLPTR]:=C;POOLPTR:=POOLPTR+1;END;MORENAME:=TRUE;END;END;
{:717}{718:}PROCEDURE ENDNAME;
BEGIN IF STRPTR+3>MAXSTRINGS THEN OVERFLOW(130,MAXSTRINGS-INITSTRPTR);
CURNAME:=STRPTR;
IF EXTDELIMITER=0 THEN CUREXT:=311 ELSE BEGIN STRPTR:=STRPTR+1;
STRSTART[STRPTR]:=EXTDELIMITER;CUREXT:=STRPTR;END;
IF AREADELIMITE<=STRSTART[STRPTR]THEN BEGIN CURAREA:=311;
STRPTR:=STRPTR+1;STRSTART[STRPTR]:=POOLPTR;
END ELSE BEGIN STRPTR:=STRPTR+1;STRSTART[STRPTR]:=AREADELIMITE;
CURAREA:=MAKESTRING;END;END;{:718}{720:}
PROCEDURE PACKFILENAME(N,A,E:STRNUMBER);VAR K:INTEGER;C:ASCIICODE;
J:POOLPOINTER;BEGIN K:=0;J:=591;
FOR J:=STRSTART[N]TO STRSTART[N+1]-1 DO BEGIN C:=STRPOOL[J];K:=K+1;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
FOR J:=STRSTART[E]TO STRSTART[E+1]-1 DO BEGIN C:=STRPOOL[J];K:=K+1;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
FOR J:=STRSTART[A]TO STRSTART[A+1]-1 DO BEGIN C:=STRPOOL[J];K:=K+1;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
IF K<=FILENAMESIZE THEN NAMELENGTH:=K ELSE NAMELENGTH:=FILENAMESIZE;
FOR K:=NAMELENGTH+1 TO FILENAMESIZE DO NAMEOFFILE[K]:=' ';END;{:720}
{724:}PROCEDURE PACKBUFFERED(N:SMALLNUMBER;A,B:INTEGER);VAR K:INTEGER;
C:ASCIICODE;J:INTEGER;D:INTEGER;
BEGIN IF N+B-A+5>FILENAMESIZE THEN B:=A+FILENAMESIZE-N-5;K:=0;
FOR J:=A TO B DO BEGIN C:=BUFFER[J];K:=K+1;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
IF B=0 THEN BEGIN D:=10;N:=18;END ELSE D:=6;
FOR J:=D TO 9 DO BEGIN C:=XORD[MFBASEDEFAUL[J]];K:=K+1;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
FOR J:=18-N+1 TO 18 DO BEGIN C:=XORD[MFBASEDEFAUL[J]];K:=K+1;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
IF K<=FILENAMESIZE THEN NAMELENGTH:=K ELSE NAMELENGTH:=FILENAMESIZE;
FOR K:=NAMELENGTH+1 TO FILENAMESIZE DO NAMEOFFILE[K]:=' ';END;{:724}
{726:}FUNCTION MAKENAMESTRI:STRNUMBER;VAR K:1..FILENAMESIZE;
BEGIN BEGIN IF POOLPTR+NAMELENGTH>POOLSIZE THEN OVERFLOW(129,POOLSIZE-
INITPOOLPTR);END;
FOR K:=1 TO NAMELENGTH DO BEGIN STRPOOL[POOLPTR]:=XORD[NAMEOFFILE[K]];
POOLPTR:=POOLPTR+1;END;MAKENAMESTRI:=MAKESTRING;END;
FUNCTION AMAKENAMESTR(VAR F:ALPHAFILE):STRNUMBER;
BEGIN AMAKENAMESTR:=MAKENAMESTRI;END;
FUNCTION BMAKENAMESTR(VAR F:BYTEFILE):STRNUMBER;
BEGIN BMAKENAMESTR:=MAKENAMESTRI;END;
FUNCTION WMAKENAMESTR(VAR F:WORDFILE):STRNUMBER;
BEGIN WMAKENAMESTR:=MAKENAMESTRI;END;{:726}{727:}PROCEDURE SCANFILENAME;
LABEL 30;BEGIN BEGINNAME;
WHILE BUFFER[CURINPUT.LOCFIELD]=32 DO CURINPUT.LOCFIELD:=CURINPUT.
LOCFIELD+1;
WHILE TRUE DO BEGIN IF(BUFFER[CURINPUT.LOCFIELD]=59)OR(BUFFER[CURINPUT.
LOCFIELD]=37)THEN GOTO 30;
IF NOT MORENAME(BUFFER[CURINPUT.LOCFIELD])THEN GOTO 30;
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;END;30:ENDNAME;END;{:727}{730:}
PROCEDURE PACKJOBNAME(S:STRNUMBER);BEGIN CURAREA:=311;CUREXT:=S;
CURNAME:=JOBNAME;PACKFILENAME(CURNAME,CURAREA,CUREXT);END;{:730}{731:}
PROCEDURE PROMPTFILENA(S,E:STRNUMBER);LABEL 30;VAR K:0..BUFSIZE;
I:POOLPOINTER;BEGIN IF INTERACTION=2 THEN WAKEUPTERMIN;
IF S=592 THEN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(593);END ELSE BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(594);END;PRINTFILENAM(CURNAME,CURAREA,CUREXT);
PRINT(595);IF E=596 THEN SHOWCONTEXT;PRINTNL(597);PRINT(S);
IF INTERACTION<2 THEN FATALERROR(598);BREAKIN(TTY,TRUE);
FOR I:=STRSTART[CURNAME]TO STRSTART[CURNAME+1]-1 DO PTWR1W(0,ORD(XCHR[
STRPOOL[I]]));
FOR I:=STRSTART[CUREXT]TO STRSTART[CUREXT+1]-1 DO PTWR1W(0,ORD(XCHR[
STRPOOL[I]]));
FOR I:=STRSTART[CURAREA]TO STRSTART[CURAREA+1]-1 DO PTWR1W(0,ORD(XCHR[
STRPOOL[I]]));PTWR1W(0,140);BEGIN BEGIN IF INSKP0 THEN END;PRINT(599);
TERMINPUT;END;{732:}BEGIN BEGINNAME;K:=FIRST;
WHILE(BUFFER[K]=32)AND(K<LAST)DO K:=K+1;
WHILE TRUE DO BEGIN IF K=LAST THEN GOTO 30;
IF NOT MORENAME(BUFFER[K])THEN GOTO 30;K:=K+1;END;30:ENDNAME;END{:732};
IF CUREXT=311 THEN CUREXT:=E;PACKFILENAME(CURNAME,CURAREA,CUREXT);END;
{:731}{733:}PROCEDURE OPENLOGFILE;VAR OLDSETTING:0..5;K:0..BUFSIZE;
L:0..BUFSIZE;M:INTEGER;MONTHS:PACKED ARRAY[1..36]OF CHAR;
BEGIN OLDSETTING:=SELECTOR;IF JOBNAME=0 THEN JOBNAME:=600;
PACKJOBNAME(601);WHILE NOT AOPENOUT(LOGFILE)DO{734:}
BEGIN IF INTERACTION<2 THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(594);END;
PRINTFILENAM(CURNAME,CURAREA,CUREXT);PRINT(595);JOBNAME:=0;HISTORY:=3;
JUMPOUT;END;PROMPTFILENA(603,601);END{:734};
LOGNAME:=AMAKENAMESTR(LOGFILE);SELECTOR:=2;{735:}
BEGIN WRITE(LOGFILE,'This is METAFONT, Version -10.0');PRINT(BASEIDENT);
PRINT(604);PRINTINT(ROUNDUNSCALE(INTERNAL[14]));PRINTCHAR(32);
MONTHS:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
M:=ROUNDUNSCALE(INTERNAL[13]);
FOR K:=3*M-2 TO 3*M DO WRITE(LOGFILE,MONTHS[K]);PRINTCHAR(32);
PRINTINT(ROUNDUNSCALE(INTERNAL[12]));PRINTCHAR(32);
M:=ROUNDUNSCALE(INTERNAL[15]);PRINTDD(M DIV 60);PRINTCHAR(58);
PRINTDD(M MOD 60);END{:735};INPUTSTACK[INPUTPTR]:=CURINPUT;PRINTNL(602);
L:=INPUTSTACK[0].LIMITFIELD-1;FOR K:=1 TO L DO PRINT(BUFFER[K]);PRINTLN;
SELECTOR:=OLDSETTING+2;END;{:733}{738:}PROCEDURE STARTINPUT;LABEL 30;
BEGIN{740:}
WHILE(CURINPUT.INDEXFIELD>6)AND(CURINPUT.LOCFIELD=0)DO ENDTOKENLIST;
IF(CURINPUT.INDEXFIELD>6)THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(607);END;BEGIN HELPPTR:=3;
HELPLINE[2]:=608;HELPLINE[1]:=609;HELPLINE[0]:=610;END;ERROR;END;
IF(CURINPUT.INDEXFIELD<=6)THEN SCANFILENAME ELSE BEGIN CURNAME:=311;
CUREXT:=311;CURAREA:=311;END{:740};IF CUREXT=311 THEN CUREXT:=596;
PACKFILENAME(CURNAME,CURAREA,CUREXT);WHILE TRUE DO BEGIN BEGINFILEREA;
IF AOPENIN(INPUTFILE[CURINPUT.INDEXFIELD])THEN GOTO 30;
PACKFILENAME(CURNAME,590,CUREXT);
IF AOPENIN(INPUTFILE[CURINPUT.INDEXFIELD])THEN GOTO 30;ENDFILEREADI;
PROMPTFILENA(592,596);END;
30:CURINPUT.NAMEFIELD:=AMAKENAMESTR(INPUTFILE[CURINPUT.INDEXFIELD]);
STRREF[CURNAME]:=127;IF JOBNAME=0 THEN BEGIN JOBNAME:=CURNAME;
OPENLOGFILE;END;
IF TERMOFFSET+(STRSTART[CURINPUT.NAMEFIELD+1]-STRSTART[CURINPUT.
NAMEFIELD])>MAXPRINTLINE-2 THEN PRINTLN ELSE IF(TERMOFFSET>0)OR(
FILEOFFSET>0)THEN PRINTCHAR(32);PRINTCHAR(40);PRINT(CURINPUT.NAMEFIELD);
BREAK(TTY);
IF CURINPUT.NAMEFIELD=STRPTR-1 THEN BEGIN FLUSHSTRING(CURINPUT.NAMEFIELD
);CURINPUT.NAMEFIELD:=CURNAME;END;{739:}
BEGIN IF INPUTLN(INPUTFILE[CURINPUT.INDEXFIELD],FALSE)THEN BEGIN IF(LAST
-CURINPUT.STARTFIELD=29)AND(BUFFER[CURINPUT.STARTFIELD]=67)AND(BUFFER[
CURINPUT.STARTFIELD+8]=22)THEN BEGIN WHILE(INPUTFILE[CURINPUT.INDEXFIELD
]↑<>CHR(12))AND(NOT EOF(INPUTFILE[CURINPUT.INDEXFIELD]))DO BEGIN READLN(
INPUTFILE[CURINPUT.INDEXFIELD]);
READ(INPUTFILE[CURINPUT.INDEXFIELD],AUXBUF:TEMPPTR);END;
BUFFER[CURINPUT.STARTFIELD]:=12;LAST:=CURINPUT.STARTFIELD+1;END;END;
PAGE:=1;FIRMUPTHELIN;BUFFER[CURINPUT.LIMITFIELD]:=37;
FIRST:=CURINPUT.LIMITFIELD+1;CURINPUT.LOCFIELD:=CURINPUT.STARTFIELD;
LINE:=1;END{:739};END;{:738}{764:}PROCEDURE BADEXP(S:STRNUMBER);
VAR SAVEFLAG:0..81;BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(S);END;PRINT(618);PRINTCMDMOD(CURCMD,CURMOD);
PRINTCHAR(39);BEGIN HELPPTR:=4;HELPLINE[3]:=619;HELPLINE[2]:=620;
HELPLINE[1]:=621;HELPLINE[0]:=622;END;BACKINPUT;CURSYM:=0;CURCMD:=41;
CURMOD:=0;INSERROR;SAVEFLAG:=VARFLAG;VARFLAG:=0;GETXNEXT;
VARFLAG:=SAVEFLAG;END;{:764}{767:}PROCEDURE STASHIN(P:HALFWORD);
BEGIN MEM[P].HH.B0:=CURTYPE;
IF CURTYPE=16 THEN MEM[P+1].INT:=CUREXP ELSE BEGIN MEM[P+1]:=MEM[CUREXP
+1];MEM[MEM[P+1].HH.LH].HH.RH:=P;FREENODE(CUREXP,2);END;CURTYPE:=1;END;
{:767}{786:}PROCEDURE BACKEXPR;BEGIN BEGINTOKENLI(2502,9);
STACKARGUMEN(STASHCUREXP);END;{:786}{788:}PROCEDURE BADSUBSCRIPT;
BEGIN DISPERR(0,635);BEGIN HELPPTR:=3;HELPLINE[2]:=636;HELPLINE[1]:=637;
HELPLINE[0]:=638;END;FLUSHERROR(0);END;{:788}{790:}
PROCEDURE OBLITERATED(Q:HALFWORD);
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(442);
END;SHOWTOKENLIS(Q,0,1000);PRINT(639);BEGIN HELPPTR:=5;HELPLINE[4]:=640;
HELPLINE[3]:=641;HELPLINE[2]:=642;HELPLINE[1]:=643;HELPLINE[0]:=644;END;
END;{:790}{794:}{795:}FUNCTION CONSTDEPENDE(V:SCALED):HALFWORD;
BEGIN DEPFINAL:=GETNODE(2);MEM[DEPFINAL+1].INT:=V;
MEM[DEPFINAL].HH.LH:=0;CONSTDEPENDE:=DEPFINAL;END;
FUNCTION SINGLEDEPEND(P:HALFWORD):HALFWORD;VAR Q:HALFWORD;
BEGIN Q:=GETNODE(2);MEM[Q+1].INT:=TWOTOTHE[28-MEM[P+1].INT];
MEM[Q].HH.LH:=P;MEM[Q].HH.RH:=CONSTDEPENDE(0);SINGLEDEPEND:=Q;END;{:795}
{796:}FUNCTION COPYDEPLIST(P:HALFWORD):HALFWORD;LABEL 30;VAR Q:HALFWORD;
BEGIN Q:=GETNODE(2);DEPFINAL:=Q;
WHILE TRUE DO BEGIN MEM[DEPFINAL].HH.LH:=MEM[P].HH.LH;
MEM[DEPFINAL+1].INT:=MEM[P+1].INT;IF MEM[DEPFINAL].HH.LH=0 THEN GOTO 30;
MEM[DEPFINAL].HH.RH:=GETNODE(2);DEPFINAL:=MEM[DEPFINAL].HH.RH;
P:=MEM[P].HH.RH;END;30:COPYDEPLIST:=Q;END;{:796}{797:}
PROCEDURE ENCAPSULATE(P:HALFWORD);BEGIN CUREXP:=GETNODE(2);
MEM[CUREXP].HH.B0:=CURTYPE;MEM[CUREXP].HH.B1:=11;NEWDEP(CUREXP,P);END;
{:797}{799:}PROCEDURE INSTALL(R,Q:HALFWORD);
BEGIN IF MEM[Q].HH.B0=16 THEN BEGIN MEM[R+1].INT:=MEM[Q+1].INT;
MEM[R].HH.B0:=16;
END ELSE IF MEM[Q].HH.B0=20 THEN IF MEM[Q+1].INT>20 THEN BEGIN MEM[R].HH
.B0:=16;MEM[R+1].INT:=0;END ELSE BEGIN MEM[R].HH.B0:=17;
NEWDEP(R,SINGLEDEPEND(Q));END ELSE BEGIN MEM[R].HH.B0:=MEM[Q].HH.B0;
NEWDEP(R,COPYDEPLIST(MEM[Q+1].HH.RH));END;END;{:799}
PROCEDURE MAKEEXPCOPY(P:HALFWORD);LABEL 20;VAR Q,R,T:HALFWORD;
BEGIN 20:CURTYPE:=MEM[P].HH.B0;
CASE CURTYPE OF 1,2,16:CUREXP:=MEM[P+1].INT;
3,5,7,10,12:CUREXP:=NEWRINGENTRY(P);4:BEGIN CUREXP:=MEM[P+1].INT;
BEGIN IF STRREF[CUREXP]<127 THEN STRREF[CUREXP]:=STRREF[CUREXP]+1;END;
END;6:BEGIN CUREXP:=MEM[P+1].INT;MEM[CUREXP].HH.LH:=MEM[CUREXP].HH.LH+1;
END;9:CUREXP:=COPYEDGES(MEM[P+1].INT);
11,13,8:CUREXP:=COPYPATH(MEM[P+1].INT);14,15:{798:}
BEGIN IF MEM[P+1].INT=0 THEN INITBIGNODE(P);T:=GETNODE(2);
MEM[T].HH.B1:=11;MEM[T].HH.B0:=CURTYPE;INITBIGNODE(T);
Q:=MEM[P+1].INT+BIGNODESIZE[CURTYPE];
R:=MEM[T+1].INT+BIGNODESIZE[CURTYPE];REPEAT Q:=Q-2;R:=R-2;INSTALL(R,Q);
UNTIL Q=MEM[P+1].INT;CUREXP:=T;END{:798};
17,18:ENCAPSULATE(COPYDEPLIST(MEM[P+1].HH.RH));
19:BEGIN MEM[P].HH.B0:=20;MEM[P+1].INT:=0;GOTO 20;END;
20:IF MEM[P+1].INT>20 THEN BEGIN CURTYPE:=16;CUREXP:=0;
END ELSE BEGIN CURTYPE:=17;ENCAPSULATE(SINGLEDEPEND(P));END;
OTHERS:CONFUSION(648)END;END;{:794}{803:}
PROCEDURE BINARYMAC(P,C,N:HALFWORD);VAR Q,R:HALFWORD;BEGIN Q:=GETAVAIL;
R:=GETAVAIL;MEM[Q].HH.RH:=R;MEM[Q].HH.LH:=P;MEM[R].HH.LH:=STASHCUREXP;
MACROCALL(C,Q,N);END;{:803}{806:}PROCEDURE MATERIALIZEP;LABEL 50;
VAR AMINUSB,APLUSB,MAJORAXIS,MINORAXIS:SCALED;THETA:ANGLE;P:HALFWORD;
BEGIN IF MEM[CUREXP].HH.B0=0 THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(654);END;BEGIN HELPPTR:=2;
HELPLINE[1]:=655;HELPLINE[0]:=422;END;PUTGETERROR;TOSSKNOTLIST(CUREXP);
CUREXP:=3;GOTO 50;END ELSE IF MEM[CUREXP].HH.B0=5 THEN{807:}
BEGIN TX:=MEM[CUREXP+1].INT;TY:=MEM[CUREXP+2].INT;
TXX:=MEM[CUREXP+3].INT-TX;TYX:=MEM[CUREXP+4].INT-TY;
TXY:=MEM[CUREXP+5].INT-TX;TYY:=MEM[CUREXP+6].INT-TY;
AMINUSB:=PYTHADD(TXX-TYY,TYX+TXY);APLUSB:=PYTHADD(TXX+TYY,TYX-TXY);
MAJORAXIS:=(AMINUSB+APLUSB)DIV 2;MINORAXIS:=(ABS(APLUSB-AMINUSB))DIV 2;
IF MAJORAXIS=MINORAXIS THEN THETA:=0 ELSE THETA:=(NARG(TXX-TYY,TYX+TXY)+
NARG(TXX+TYY,TYX-TXY))DIV 2;FREENODE(CUREXP,7);
CUREXP:=MAKEELLIPSE(MAJORAXIS,MINORAXIS,THETA);
IF(TX<>0)OR(TY<>0)THEN{808:}BEGIN P:=CUREXP;
REPEAT MEM[P+1].INT:=MEM[P+1].INT+TX;MEM[P+2].INT:=MEM[P+2].INT+TY;
P:=MEM[P].HH.RH;UNTIL P=CUREXP;END{:808};END{:807};
CUREXP:=MAKEPEN(CUREXP);50:CURTYPE:=6;END;{:806}{811:}{812:}
FUNCTION KNOWNPAIR:HALFWORD;VAR P:HALFWORD;
BEGIN IF CURTYPE<>15 THEN BEGIN DISPERR(0,658);BEGIN HELPPTR:=3;
HELPLINE[2]:=659;HELPLINE[1]:=660;HELPLINE[0]:=661;END;PUTGETFLUSHE(0);
KNOWNPAIR:=0;END ELSE BEGIN P:=MEM[CUREXP+1].INT;FREENODE(CUREXP,2);
{813:}IF MEM[P].HH.B0<>16 THEN BEGIN DISPERR(P,662);BEGIN HELPPTR:=3;
HELPLINE[2]:=663;HELPLINE[1]:=660;HELPLINE[0]:=661;END;PUTGETERROR;
RECYCLEVALUE(P);MEM[P].HH.B0:=16;MEM[P+1].INT:=0;END;
IF MEM[P+2].HH.B0<>16 THEN BEGIN DISPERR(P+2,664);BEGIN HELPPTR:=3;
HELPLINE[2]:=665;HELPLINE[1]:=660;HELPLINE[0]:=661;END;PUTGETERROR;
RECYCLEVALUE(P+2);MEM[P+2].HH.B0:=16;MEM[P+3].INT:=0;END{:813};
CURTYPE:=1;KNOWNPAIR:=P;END;END;{:812}FUNCTION NEWFRAGMENT:HALFWORD;
VAR Q:HALFWORD;P:HALFWORD;BEGIN Q:=GETNODE(7);MEM[Q].HH.B0:=5;
MEM[Q].HH.B1:=4;MEM[Q+5].INT:=65536;MEM[Q].HH.RH:=Q;P:=KNOWNPAIR;
IF P=0 THEN BEGIN MEM[Q+1].INT:=0;MEM[Q+2].INT:=0;
END ELSE BEGIN MEM[Q+1].INT:=MEM[P+1].INT;MEM[Q+2].INT:=MEM[P+3].INT;
FREENODE(P,4);END;NEWFRAGMENT:=Q;END;{:811}{821:}
FUNCTION FIXFRAGMENT(P:HALFWORD):HALFWORD;VAR R:HALFWORD;BEGIN R:=0;
IF MEM[P].HH.B1=2 THEN IF(MEM[P+5].INT=0)AND(MEM[P+6].INT=0)THEN BEGIN
MEM[P].HH.B1:=4;MEM[P+5].INT:=65536;END ELSE BEGIN R:=GETNODE(3);
MEM[R+1].INT:=MEM[P+5].INT;MEM[R+2].INT:=MEM[P+6].INT;MEM[P+5].INT:=R;
END;MEM[P].HH.B0:=MEM[P].HH.B1;MEM[P+3].INT:=MEM[P+5].INT;
FIXFRAGMENT:=R;END;{:821}{837:}PROCEDURE DONULLARY(C:QUARTERWORD);
VAR K:INTEGER;BEGIN BEGIN IF ARITHERROR THEN CLEARARITH;END;
IF INTERNAL[6]>131072 THEN SHOWCMDMOD(32,C);
CASE C OF 30,31:BEGIN CURTYPE:=2;CUREXP:=C;END;32:BEGIN CURTYPE:=9;
CUREXP:=NEWEDGES;END;33:BEGIN CURTYPE:=6;CUREXP:=3;END;
37:BEGIN CURTYPE:=16;CUREXP:=NORMRAND;END;36:{838:}BEGIN CURTYPE:=8;
CUREXP:=GETNODE(7);MEM[CUREXP].HH.B0:=5;MEM[CUREXP].HH.B1:=5;
MEM[CUREXP].HH.RH:=CUREXP;MEM[CUREXP+1].INT:=0;MEM[CUREXP+2].INT:=0;
MEM[CUREXP+3].INT:=65536;MEM[CUREXP+4].INT:=0;MEM[CUREXP+5].INT:=0;
MEM[CUREXP+6].INT:=65536;END{:838};
34:BEGIN IF JOBNAME=0 THEN OPENLOGFILE;CURTYPE:=4;CUREXP:=JOBNAME;END;
35:{839:}BEGIN IF INTERACTION<=1 THEN FATALERROR(533);BEGINFILEREA;
CURINPUT.NAMEFIELD:=1;BEGIN BEGIN IF INSKP0 THEN END;PRINT(311);
TERMINPUT;END;
BEGIN IF POOLPTR+LAST-CURINPUT.STARTFIELD>POOLSIZE THEN OVERFLOW(129,
POOLSIZE-INITPOOLPTR);END;
FOR K:=CURINPUT.STARTFIELD TO LAST-1 DO BEGIN STRPOOL[POOLPTR]:=BUFFER[K
];POOLPTR:=POOLPTR+1;END;ENDFILEREADI;CURTYPE:=4;CUREXP:=MAKESTRING;
END{:839};END;BEGIN IF ARITHERROR THEN CLEARARITH;END;END;{:837}{840:}
{841:}FUNCTION NICEPAIR(P:HALFWORD;T:QUARTERWORD):BOOLEAN;LABEL 10;
BEGIN IF T=15 THEN BEGIN P:=MEM[P+1].INT;
IF MEM[P].HH.B0=16 THEN IF MEM[P+2].HH.B0=16 THEN BEGIN NICEPAIR:=TRUE;
GOTO 10;END;END;NICEPAIR:=FALSE;10:END;{:841}{842:}
PROCEDURE PRINTKNOWNOR(T:SMALLNUMBER;V:INTEGER);BEGIN PRINTCHAR(40);
IF T<17 THEN IF T<>15 THEN PRINTTYPE(T)ELSE IF NICEPAIR(V,15)THEN PRINT(
211)ELSE PRINT(683)ELSE PRINT(684);PRINTCHAR(41);END;{:842}{843:}
PROCEDURE BADUNARY(C:QUARTERWORD);BEGIN DISPERR(0,685);PRINTOP(C);
PRINTKNOWNOR(CURTYPE,CUREXP);BEGIN HELPPTR:=3;HELPLINE[2]:=686;
HELPLINE[1]:=687;HELPLINE[0]:=688;END;PUTGETERROR;END;{:843}{846:}
PROCEDURE NEGATEDEPLIS(P:HALFWORD);LABEL 10;
BEGIN WHILE TRUE DO BEGIN MEM[P+1].INT:=-MEM[P+1].INT;
IF MEM[P].HH.LH=0 THEN GOTO 10;P:=MEM[P].HH.RH;END;10:END;{:846}{850:}
PROCEDURE PAIRTOPATH;BEGIN CUREXP:=NEWFRAGMENT;CURTYPE:=11;
MEM[CUREXP].HH.B0:=0;MEM[CUREXP].HH.B1:=0;END;{:850}{852:}
PROCEDURE TAKEPART(C:QUARTERWORD);VAR P:HALFWORD;N:SMALLNUMBER;
Q:HALFWORD;BEGIN MEM[20].INT:=MEM[CUREXP+1].INT;MEM[19].HH.B0:=CURTYPE;
N:=BIGNODESIZE[CURTYPE];Q:=MEM[20].INT+2*(C-49);CURTYPE:=MEM[Q].HH.B0;
IF CURTYPE=16 THEN BEGIN FREENODE(CUREXP,2);CUREXP:=MEM[Q+1].INT;
END ELSE BEGIN MEM[CUREXP].HH.B0:=CURTYPE;MEM[CUREXP+1]:=MEM[Q+1];
MEM[MEM[CUREXP+1].HH.LH].HH.RH:=CUREXP;MEM[Q].HH.B0:=16;END;
RECYCLEVALUE(19);END;{:852}{854:}PROCEDURE STRTONUM(C:QUARTERWORD);
VAR N:INTEGER;M:ASCIICODE;K:POOLPOINTER;B:8..16;BADCHAR:BOOLEAN;
BEGIN IF C=46 THEN IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])=0 THEN N:=-1
ELSE N:=STRPOOL[STRSTART[CUREXP]]ELSE BEGIN IF C=44 THEN B:=8 ELSE B:=16
;N:=0;BADCHAR:=FALSE;
FOR K:=STRSTART[CUREXP]TO STRSTART[CUREXP+1]-1 DO BEGIN M:=STRPOOL[K];
IF(M>=48)AND(M<=57)THEN M:=M-48 ELSE IF(M>=65)AND(M<=70)THEN M:=M-55
ELSE IF(M>=97)AND(M<=102)THEN M:=M-87 ELSE BEGIN BADCHAR:=TRUE;M:=0;END;
IF M>=B THEN BEGIN BADCHAR:=TRUE;M:=0;END;
IF N<32768 DIV B THEN N:=N*B+M ELSE N:=32767;END;{855:}
IF BADCHAR THEN BEGIN DISPERR(0,690);IF C=44 THEN BEGIN HELPPTR:=1;
HELPLINE[0]:=691;END ELSE BEGIN HELPPTR:=1;HELPLINE[0]:=692;END;
PUTGETERROR;END;
IF N>4095 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(693);END;PRINTINT(N);PRINTCHAR(41);BEGIN HELPPTR:=1;
HELPLINE[0]:=694;END;PUTGETERROR;END{:855};END;FLUSHCUREXP(N*65536);END;
{:854}{856:}FUNCTION PATHLENGTH:SCALED;VAR N:SCALED;P:HALFWORD;
BEGIN P:=CUREXP;IF MEM[P].HH.B0=0 THEN N:=-65536 ELSE N:=0;
REPEAT P:=MEM[P].HH.RH;N:=N+65536;UNTIL P=CUREXP;PATHLENGTH:=N;END;
{:856}{858:}PROCEDURE TESTKNOWN;LABEL 30;VAR B:30..31;P,Q:HALFWORD;
BEGIN B:=31;CASE CURTYPE OF 2,4,6,8,9,11,13,16:B:=30;
14,15:BEGIN P:=MEM[CUREXP+1].INT;Q:=P+BIGNODESIZE[CURTYPE];
REPEAT Q:=Q-2;IF MEM[Q].HH.B0<>16 THEN GOTO 30;UNTIL Q=P;B:=30;30:END;
OTHERS:END;FLUSHCUREXP(B);CURTYPE:=2;END;{:858}
PROCEDURE DOUNARY(C:QUARTERWORD);VAR P:HALFWORD;
BEGIN BEGIN IF ARITHERROR THEN CLEARARITH;END;
IF INTERNAL[6]>131072 THEN{844:}BEGIN BEGINDIAGNOS;PRINTNL(123);
PRINTOP(C);PRINTCHAR(40);PRINTEXP(0,0);PRINT(689);ENDDIAGNOSTI(FALSE);
END{:844};CASE C OF 65:IF CURTYPE<15 THEN BADUNARY(65);66:{845:}
CASE CURTYPE OF 15:BEGIN P:=MEM[CUREXP+1].INT;
IF MEM[P].HH.B0=16 THEN MEM[P+1].INT:=-MEM[P+1].INT ELSE NEGATEDEPLIS(
MEM[P+1].HH.RH);
IF MEM[P+2].HH.B0=16 THEN MEM[P+3].INT:=-MEM[P+3].INT ELSE NEGATEDEPLIS(
MEM[P+3].HH.RH);END;17,18:NEGATEDEPLIS(MEM[CUREXP+1].HH.RH);
16:CUREXP:=-CUREXP;OTHERS:BADUNARY(66)END{:845};{847:}
40:IF CURTYPE<>2 THEN BADUNARY(40)ELSE CUREXP:=61-CUREXP;{:847}{848:}
55,56,57,58,59,60,61,38,62:IF CURTYPE<>16 THEN BADUNARY(C)ELSE CASE C OF
55:CUREXP:=SQUARERT(CUREXP);56:CUREXP:=MEXP(CUREXP);
57:CUREXP:=MLOG(CUREXP);58,59:BEGIN NSINCOS((CUREXP MOD 23592960)*16);
IF C=58 THEN CUREXP:=ROUNDFRACTIO(NSIN)ELSE CUREXP:=ROUNDFRACTIO(NCOS);
END;60:CUREXP:=FLOORSCALED(CUREXP);61:CUREXP:=UNIFRAND(CUREXP);
38:BEGIN IF ODD(ROUNDUNSCALE(CUREXP))THEN CUREXP:=30 ELSE CUREXP:=31;
CURTYPE:=2;END;62:{1106:}BEGIN CUREXP:=ROUNDUNSCALE(CUREXP)MOD 256;
IF CUREXP<0 THEN CUREXP:=CUREXP+256;
IF CHAREXISTS[CUREXP]THEN CUREXP:=30 ELSE CUREXP:=31;CURTYPE:=2;
END{:1106};END;{:848}{849:}
63:IF NICEPAIR(CUREXP,CURTYPE)THEN BEGIN P:=MEM[CUREXP+1].INT;
FLUSHCUREXP((NARG(MEM[P+1].INT,MEM[P+3].INT)+8)DIV 16)END ELSE BADUNARY(
63);{:849}{851:}
49,50:IF(CURTYPE<=15)AND(CURTYPE>=14)THEN TAKEPART(C)ELSE BADUNARY(C);
51,52,53,54:IF CURTYPE=14 THEN TAKEPART(C)ELSE BADUNARY(C);{:851}{853:}
47:IF CURTYPE<>16 THEN BADUNARY(47)ELSE BEGIN CUREXP:=ROUNDUNSCALE(
CUREXP)MOD 128;CURTYPE:=4;IF CUREXP<0 THEN CUREXP:=CUREXP+128;END;
41:IF CURTYPE<>16 THEN BADUNARY(41)ELSE BEGIN OLDSETTING:=SELECTOR;
SELECTOR:=5;PRINTSCALED(CUREXP);CUREXP:=MAKESTRING;SELECTOR:=OLDSETTING;
CURTYPE:=4;END;44,45,46:IF CURTYPE<>4 THEN BADUNARY(C)ELSE STRTONUM(C);
48:IF CURTYPE=4 THEN BEGIN BEGIN IF STRREF[CUREXP]<127 THEN IF STRREF[
CUREXP]>1 THEN STRREF[CUREXP]:=STRREF[CUREXP]-1 ELSE FLUSHSTRING(CUREXP)
;END;CURTYPE:=16;CUREXP:=(STRSTART[CUREXP+1]-STRSTART[CUREXP])*65536;
END ELSE IF CURTYPE=11 THEN FLUSHCUREXP(PATHLENGTH)ELSE IF CURTYPE=15
THEN FLUSHCUREXP(0)ELSE BADUNARY(C);{:853}{857:}
2:BEGIN IF(CURTYPE>=2)AND(CURTYPE<=3)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
4:BEGIN IF(CURTYPE>=4)AND(CURTYPE<=5)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
6:BEGIN IF(CURTYPE>=6)AND(CURTYPE<=8)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
9:BEGIN IF(CURTYPE>=9)AND(CURTYPE<=10)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
11:BEGIN IF(CURTYPE>=11)AND(CURTYPE<=13)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
14,15:BEGIN IF CURTYPE=C THEN FLUSHCUREXP(30)ELSE FLUSHCUREXP(31);
CURTYPE:=2;END;
19:BEGIN IF(CURTYPE>=16)AND(CURTYPE<=18)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;39:TESTKNOWN;{:857}{859:}
64:BEGIN IF CURTYPE<>11 THEN FLUSHCUREXP(31)ELSE IF MEM[CUREXP].HH.B0<>0
THEN FLUSHCUREXP(30)ELSE FLUSHCUREXP(31);CURTYPE:=2;END;{:859}{860:}
43:BEGIN IF CURTYPE=15 THEN PAIRTOPATH;
IF CURTYPE=11 THEN CURTYPE:=8 ELSE BADUNARY(43);END;
42:IF CURTYPE=11 THEN BEGIN P:=MEM[HTAPYPOC(CUREXP)].HH.RH;
TOSSKNOTLIST(CUREXP);CUREXP:=P;
END ELSE IF CURTYPE=15 THEN PAIRTOPATH ELSE BADUNARY(42);{:860}END;
BEGIN IF ARITHERROR THEN CLEARARITH;END;END;{:840}{861:}{862:}
PROCEDURE BADBINARY(P:HALFWORD;C:QUARTERWORD);BEGIN DISPERR(P,311);
DISPERR(0,685);IF C>=90 THEN PRINTOP(C);PRINTKNOWNOR(MEM[P].HH.B0,P);
IF C>=90 THEN PRINT(337)ELSE PRINTOP(C);PRINTKNOWNOR(CURTYPE,CUREXP);
BEGIN HELPPTR:=3;HELPLINE[2]:=686;HELPLINE[1]:=695;HELPLINE[0]:=696;END;
PUTGETERROR;END;{:862}{865:}{871:}PROCEDURE DEPFINISH(V,Q:HALFWORD;
T:SMALLNUMBER);VAR P:HALFWORD;VV:SCALED;
BEGIN IF Q=0 THEN P:=CUREXP ELSE P:=Q;MEM[P+1].HH.RH:=V;MEM[P].HH.B0:=T;
IF MEM[V].HH.LH=0 THEN BEGIN VV:=MEM[V+1].INT;
IF Q=0 THEN FLUSHCUREXP(VV)ELSE BEGIN RECYCLEVALUE(P);MEM[Q].HH.B0:=16;
MEM[Q+1].INT:=VV;END;END ELSE IF Q=0 THEN CURTYPE:=T;END;{:871}
PROCEDURE ADDORSUBTRAC(P,Q:HALFWORD;C:QUARTERWORD);LABEL 30,10;
VAR S,T:SMALLNUMBER;R,U:HALFWORD;V:INTEGER;
BEGIN IF Q=0 THEN BEGIN T:=CURTYPE;
IF T<17 THEN V:=CUREXP ELSE V:=MEM[CUREXP+1].HH.RH;
END ELSE BEGIN T:=MEM[Q].HH.B0;
IF T<17 THEN V:=MEM[Q+1].INT ELSE V:=MEM[Q+1].HH.RH;END;
IF T=16 THEN BEGIN IF C=66 THEN V:=-V;
IF MEM[P].HH.B0=16 THEN BEGIN V:=MEM[P+1].INT+V;
IF Q=0 THEN CUREXP:=V ELSE MEM[Q+1].INT:=V;GOTO 10;END;{866:}
R:=MEM[P+1].HH.RH;WHILE MEM[R].HH.LH<>0 DO R:=MEM[R].HH.RH;
MEM[R+1].INT:=MEM[R+1].INT+V;IF Q=0 THEN BEGIN Q:=GETNODE(2);CUREXP:=Q;
CURTYPE:=MEM[P].HH.B0;MEM[Q].HH.B1:=11;END;
MEM[Q+1].HH.RH:=MEM[P+1].HH.RH;MEM[Q].HH.B0:=MEM[P].HH.B0;
MEM[Q+1].HH.LH:=MEM[P+1].HH.LH;MEM[MEM[P+1].HH.LH].HH.RH:=Q;
MEM[P].HH.B0:=16;{:866};END ELSE BEGIN IF C=66 THEN NEGATEDEPLIS(V);
{867:}IF MEM[P].HH.B0=16 THEN{869:}
BEGIN WHILE MEM[V].HH.LH<>0 DO V:=MEM[V].HH.RH;
MEM[V+1].INT:=MEM[P+1].INT+MEM[V+1].INT;END{:869}
ELSE BEGIN S:=MEM[P].HH.B0;R:=MEM[P+1].HH.RH;
IF T=17 THEN BEGIN IF S=17 THEN IF MAXCOEF(R)+MAXCOEF(V)<626349397 THEN
BEGIN V:=PPLUSQ(V,R,17);GOTO 30;END;{868:}T:=18;U:=V;
WHILE MEM[U].HH.LH<>0 DO BEGIN MEM[U+1].INT:=ROUNDFRACTIO(MEM[U+1].INT);
U:=MEM[U].HH.RH;END{:868};END;
IF S=18 THEN V:=PPLUSQ(V,R,18)ELSE V:=PPLUSFQ(V,65536,R,18,17);
IF FIXNEEDED THEN FIXDEPENDENC;30:{870:}
IF Q<>0 THEN DEPFINISH(V,Q,T)ELSE BEGIN CURTYPE:=T;DEPFINISH(V,0,T);
END{:870};END{:867};END;10:END;{:865}{879:}PROCEDURE DEPMULT(P:HALFWORD;
V:INTEGER;VISSCALED:BOOLEAN);LABEL 10;VAR Q:HALFWORD;S,T:SMALLNUMBER;
W:FRACTION;
BEGIN IF P=0 THEN Q:=CUREXP ELSE IF MEM[P].HH.B0<>16 THEN Q:=P ELSE
BEGIN IF VISSCALED THEN MEM[P+1].INT:=TAKESCALED(MEM[P+1].INT,V)ELSE MEM
[P+1].INT:=TAKEFRACTION(MEM[P+1].INT,V);GOTO 10;END;T:=MEM[Q].HH.B0;
Q:=MEM[Q+1].HH.RH;S:=T;
IF T=17 THEN IF VISSCALED THEN IF ABVSCD(MAXCOEF(Q),ABS(V),626349396,
65536)>=0 THEN T:=18;Q:=PTIMESV(Q,V,S,T,VISSCALED);DEPFINISH(Q,P,T);
10:END;{:879}{881:}PROCEDURE HARDTIMES(P:HALFWORD);VAR Q:HALFWORD;
R:HALFWORD;U,V:SCALED;
BEGIN IF MEM[P].HH.B0=15 THEN BEGIN Q:=STASHCUREXP;UNSTASHCUREX(P);P:=Q;
END;R:=MEM[CUREXP+1].INT;U:=MEM[R+1].INT;V:=MEM[R+3].INT;{882:}
MEM[R+2].HH.B0:=MEM[P].HH.B0;NEWDEP(R+2,COPYDEPLIST(MEM[P+1].HH.RH));
MEM[R].HH.B0:=MEM[P].HH.B0;MEM[R+1]:=MEM[P+1];
MEM[MEM[P+1].HH.LH].HH.RH:=R;FREENODE(P,2){:882};DEPMULT(R,U,TRUE);
DEPMULT(R+2,V,TRUE);END;{:881}{884:}PROCEDURE DEPDIV(P:HALFWORD;
V:SCALED);LABEL 10;VAR Q:HALFWORD;S,T:SMALLNUMBER;W:FRACTION;
BEGIN IF P=0 THEN Q:=CUREXP ELSE IF MEM[P].HH.B0<>16 THEN Q:=P ELSE
BEGIN MEM[P+1].INT:=MAKESCALED(MEM[P+1].INT,V);GOTO 10;END;
T:=MEM[Q].HH.B0;Q:=MEM[Q+1].HH.RH;S:=T;
IF T=17 THEN IF ABVSCD(MAXCOEF(Q),65536,626349396,ABS(V))>=0 THEN T:=18;
Q:=POVERV(Q,V,S,T);DEPFINISH(Q,P,T);10:END;{:884}{888:}
PROCEDURE SETUPTRANS(C:QUARTERWORD);LABEL 30,10;VAR P,Q,R:HALFWORD;
BEGIN IF(C<>84)OR(CURTYPE<>14)THEN{890:}BEGIN P:=STASHCUREXP;
CUREXP:=IDTRANSFORM;CURTYPE:=14;Q:=MEM[CUREXP+1].INT;CASE C OF{892:}
80:IF MEM[P].HH.B0=16 THEN{893:}
BEGIN NSINCOS((MEM[P+1].INT MOD 23592960)*16);
MEM[Q+5].INT:=ROUNDFRACTIO(NCOS);MEM[Q+9].INT:=ROUNDFRACTIO(NSIN);
MEM[Q+7].INT:=-MEM[Q+9].INT;MEM[Q+11].INT:=MEM[Q+5].INT;GOTO 30;
END{:893};81:IF MEM[P].HH.B0>15 THEN BEGIN INSTALL(Q+6,P);GOTO 30;END;
82:IF MEM[P].HH.B0>15 THEN BEGIN INSTALL(Q+4,P);INSTALL(Q+10,P);GOTO 30;
END;83:IF MEM[P].HH.B0=15 THEN BEGIN R:=MEM[P+1].INT;INSTALL(Q,R);
INSTALL(Q+2,R+2);GOTO 30;END;
85:IF MEM[P].HH.B0>15 THEN BEGIN INSTALL(Q+4,P);GOTO 30;END;
86:IF MEM[P].HH.B0>15 THEN BEGIN INSTALL(Q+10,P);GOTO 30;END;
87:IF MEM[P].HH.B0=15 THEN{894:}BEGIN R:=MEM[P+1].INT;INSTALL(Q+4,R);
INSTALL(Q+10,R);INSTALL(Q+8,R+2);
IF MEM[R+2].HH.B0=16 THEN MEM[R+3].INT:=-MEM[R+3].INT ELSE NEGATEDEPLIS(
MEM[R+3].HH.RH);INSTALL(Q+6,R+2);GOTO 30;END{:894};84:;{:892}END;
DISPERR(P,704);BEGIN HELPPTR:=2;HELPLINE[1]:=705;HELPLINE[0]:=706;END;
PUTGETERROR;30:RECYCLEVALUE(P);FREENODE(P,2);END{:890};{891:}
Q:=MEM[CUREXP+1].INT;R:=Q+12;REPEAT R:=R-2;
IF MEM[R].HH.B0<>16 THEN GOTO 10;UNTIL R=Q;TXX:=MEM[Q+5].INT;
TXY:=MEM[Q+7].INT;TYX:=MEM[Q+9].INT;TYY:=MEM[Q+11].INT;TX:=MEM[Q+1].INT;
TY:=MEM[Q+3].INT;FLUSHCUREXP(0){:891};10:END;{:888}{895:}
PROCEDURE SETUPKNOWNTR(C:QUARTERWORD);BEGIN SETUPTRANS(C);
IF CURTYPE<>16 THEN BEGIN DISPERR(0,707);BEGIN HELPPTR:=2;
HELPLINE[1]:=708;HELPLINE[0]:=709;END;PUTGETFLUSHE(0);TXX:=65536;TXY:=0;
TYX:=0;TYY:=65536;TX:=0;TY:=0;END;END;{:895}{896:}
PROCEDURE TRANS(P,Q:HALFWORD);VAR V:SCALED;
BEGIN V:=TAKESCALED(MEM[P].INT,TXX)+TAKESCALED(MEM[Q].INT,TXY)+TX;
MEM[Q].INT:=TAKESCALED(MEM[P].INT,TYX)+TAKESCALED(MEM[Q].INT,TYY)+TY;
MEM[P].INT:=V;END;{:896}{897:}PROCEDURE PATHTRANS(P:HALFWORD;
C:QUARTERWORD);VAR Q:HALFWORD;BEGIN SETUPKNOWNTR(C);UNSTASHCUREX(P);
Q:=CUREXP;REPEAT IF MEM[Q].HH.B0<>0 THEN TRANS(Q+3,Q+4);TRANS(Q+1,Q+2);
IF MEM[Q].HH.B1<>0 THEN TRANS(Q+5,Q+6);Q:=MEM[Q].HH.RH;UNTIL Q=CUREXP;
END;{:897}{898:}PROCEDURE EDGESTRANS(P:HALFWORD;C:QUARTERWORD);LABEL 10;
BEGIN SETUPKNOWNTR(C);UNSTASHCUREX(P);CUREDGES:=CUREXP;
IF MEM[CUREDGES].HH.RH=CUREDGES THEN GOTO 10;
IF ABS(TXY)=65536 THEN IF ABS(TYX)=65536 THEN IF TXX=0 THEN IF TYY=0
THEN BEGIN XYSWAPEDGES;TXX:=TXY;TYY:=TYX;TXY:=0;TYX:=0;
IF MEM[CUREDGES].HH.RH=CUREDGES THEN GOTO 10;END;
IF ABS(TXX)=65536 THEN IF ABS(TYY)=65536 THEN IF TXY=0 THEN IF TYX=0
THEN BEGIN IF TXX<0 THEN XREFLECTEDGE;IF TYY<0 THEN YREFLECTEDGE;{899:}
TX:=ROUNDUNSCALE(TX);TY:=ROUNDUNSCALE(TY);
IF(MEM[CUREDGES+2].HH.LH+TX<=0)OR(MEM[CUREDGES+2].HH.RH+TX>=8192)OR(MEM[
CUREDGES+1].HH.LH+TY<=0)OR(MEM[CUREDGES+1].HH.RH+TY>=8191)OR(ABS(TX)>=
4096)OR(ABS(TY)>=4096)THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(713);END;BEGIN HELPPTR:=2;
HELPLINE[1]:=714;HELPLINE[0]:=715;END;PUTGETERROR;
END ELSE BEGIN IF TX<>0 THEN BEGIN IF NOT(ABS(MEM[CUREDGES+3].HH.LH-TX
-4096)<4096)THEN FIXOFFSET;
MEM[CUREDGES+2].HH.LH:=MEM[CUREDGES+2].HH.LH+TX;
MEM[CUREDGES+2].HH.RH:=MEM[CUREDGES+2].HH.RH+TX;
MEM[CUREDGES+3].HH.LH:=MEM[CUREDGES+3].HH.LH-TX;MEM[CUREDGES+4].INT:=0;
END;IF TY<>0 THEN BEGIN MEM[CUREDGES+1].HH.LH:=MEM[CUREDGES+1].HH.LH+TY;
MEM[CUREDGES+1].HH.RH:=MEM[CUREDGES+1].HH.RH+TY;
MEM[CUREDGES+5].HH.LH:=MEM[CUREDGES+5].HH.LH+TY;MEM[CUREDGES+4].INT:=0;
END;END{:899};GOTO 10;END;BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(710);END;BEGIN HELPPTR:=2;HELPLINE[1]:=711;
HELPLINE[0]:=712;END;PUTGETERROR;10:END;{:898}{900:}{902:}
PROCEDURE BILIN1(P:HALFWORD;T:SCALED;Q:HALFWORD;U,DELTA:SCALED);
VAR R:HALFWORD;BEGIN IF T<>65536 THEN DEPMULT(P,T,TRUE);
IF U<>0 THEN IF MEM[Q].HH.B0=16 THEN DELTA:=DELTA+TAKESCALED(MEM[Q+1].
INT,U)ELSE BEGIN{903:}
IF MEM[P].HH.B0<>18 THEN BEGIN IF MEM[P].HH.B0=16 THEN NEWDEP(P,
CONSTDEPENDE(MEM[P+1].INT))ELSE MEM[P+1].HH.RH:=PTIMESV(MEM[P+1].HH.RH,
65536,17,18,TRUE);MEM[P].HH.B0:=18;END{:903};
MEM[P+1].HH.RH:=PPLUSFQ(MEM[P+1].HH.RH,U,MEM[Q+1].HH.RH,18,MEM[Q].HH.B0)
;END;
IF MEM[P].HH.B0=16 THEN MEM[P+1].INT:=MEM[P+1].INT+DELTA ELSE BEGIN R:=
MEM[P+1].HH.RH;WHILE MEM[R].HH.LH<>0 DO R:=MEM[R].HH.RH;
DELTA:=MEM[R+1].INT+DELTA;
IF R<>MEM[P+1].HH.RH THEN MEM[R+1].INT:=DELTA ELSE BEGIN RECYCLEVALUE(P)
;MEM[P].HH.B0:=16;MEM[P+1].INT:=DELTA;END;END;END;{:902}{905:}
PROCEDURE ADDMULTDEP(P:HALFWORD;V:SCALED;R:HALFWORD);
BEGIN IF MEM[R].HH.B0=16 THEN MEM[DEPFINAL+1].INT:=MEM[DEPFINAL+1].INT+
TAKESCALED(MEM[R+1].INT,V)ELSE MEM[P+1].HH.RH:=PPLUSFQ(MEM[P+1].HH.RH,V,
MEM[R+1].HH.RH,18,MEM[R].HH.B0);END;{:905}{906:}
PROCEDURE BILIN2(P,T:HALFWORD;V:SCALED;U,Q:HALFWORD);VAR VV:SCALED;
R:HALFWORD;BEGIN VV:=MEM[P+1].INT;MEM[P].HH.B0:=18;
NEWDEP(P,CONSTDEPENDE(0));IF VV<>0 THEN ADDMULTDEP(P,VV,T);
IF V<>0 THEN ADDMULTDEP(P,V,U);IF Q<>0 THEN ADDMULTDEP(P,65536,Q);
IF MEM[P+1].HH.RH=DEPFINAL THEN BEGIN VV:=MEM[DEPFINAL+1].INT;
RECYCLEVALUE(P);MEM[P].HH.B0:=16;MEM[P+1].INT:=VV;END;END;{:906}{908:}
PROCEDURE BILIN3(P:HALFWORD;T,V,U,DELTA:SCALED);
BEGIN IF T<>65536 THEN DELTA:=DELTA+TAKESCALED(MEM[P+1].INT,T)ELSE DELTA
:=DELTA+MEM[P+1].INT;
IF U<>0 THEN MEM[P+1].INT:=DELTA+TAKESCALED(V,U)ELSE MEM[P+1].INT:=DELTA
;END;{:908}PROCEDURE BIGTRANS(P:HALFWORD;C:QUARTERWORD);LABEL 10;
VAR Q,R,PP,QQ:HALFWORD;S:SMALLNUMBER;BEGIN S:=BIGNODESIZE[MEM[P].HH.B0];
Q:=MEM[P+1].INT;R:=Q+S;REPEAT R:=R-2;IF MEM[R].HH.B0<>16 THEN{901:}
BEGIN SETUPKNOWNTR(C);MAKEEXPCOPY(P);R:=MEM[CUREXP+1].INT;
IF CURTYPE=14 THEN BEGIN BILIN1(R+10,TYY,Q+6,TYX,0);
BILIN1(R+8,TYY,Q+4,TYX,0);BILIN1(R+6,TXX,Q+10,TXY,0);
BILIN1(R+4,TXX,Q+8,TXY,0);END;BILIN1(R+2,TYY,Q,TYX,TY);
BILIN1(R,TXX,Q+2,TXY,TX);GOTO 10;END{:901};UNTIL R=Q;{904:}
SETUPTRANS(C);IF CURTYPE=16 THEN{907:}BEGIN MAKEEXPCOPY(P);
R:=MEM[CUREXP+1].INT;
IF CURTYPE=14 THEN BEGIN BILIN3(R+10,TYY,MEM[Q+7].INT,TYX,0);
BILIN3(R+8,TYY,MEM[Q+5].INT,TYX,0);BILIN3(R+6,TXX,MEM[Q+11].INT,TXY,0);
BILIN3(R+4,TXX,MEM[Q+9].INT,TXY,0);END;
BILIN3(R+2,TYY,MEM[Q+1].INT,TYX,TY);BILIN3(R,TXX,MEM[Q+3].INT,TXY,TX);
END{:907}ELSE BEGIN PP:=STASHCUREXP;QQ:=MEM[PP+1].INT;MAKEEXPCOPY(P);
R:=MEM[CUREXP+1].INT;
IF CURTYPE=14 THEN BEGIN BILIN2(R+10,QQ+10,MEM[Q+7].INT,QQ+8,0);
BILIN2(R+8,QQ+10,MEM[Q+5].INT,QQ+8,0);
BILIN2(R+6,QQ+4,MEM[Q+11].INT,QQ+6,0);
BILIN2(R+4,QQ+4,MEM[Q+9].INT,QQ+6,0);END;
BILIN2(R+2,QQ+10,MEM[Q+1].INT,QQ+8,QQ+2);
BILIN2(R,QQ+4,MEM[Q+3].INT,QQ+6,QQ);RECYCLEVALUE(PP);END;{:904};10:END;
{:900}{910:}PROCEDURE CAT(P:HALFWORD);VAR A,B:STRNUMBER;K:POOLPOINTER;
BEGIN A:=MEM[P+1].INT;B:=CUREXP;
BEGIN IF POOLPTR+(STRSTART[A+1]-STRSTART[A])+(STRSTART[B+1]-STRSTART[B])
>POOLSIZE THEN OVERFLOW(129,POOLSIZE-INITPOOLPTR);END;
FOR K:=STRSTART[A]TO STRSTART[A+1]-1 DO BEGIN STRPOOL[POOLPTR]:=STRPOOL[
K];POOLPTR:=POOLPTR+1;END;
FOR K:=STRSTART[B]TO STRSTART[B+1]-1 DO BEGIN STRPOOL[POOLPTR]:=STRPOOL[
K];POOLPTR:=POOLPTR+1;END;CUREXP:=MAKESTRING;
BEGIN IF STRREF[B]<127 THEN IF STRREF[B]>1 THEN STRREF[B]:=STRREF[B]-1
ELSE FLUSHSTRING(B);END;END;{:910}{911:}
PROCEDURE CHOPSTRING(P:HALFWORD);VAR A,B:INTEGER;L:INTEGER;K:INTEGER;
S:STRNUMBER;BEGIN A:=ROUNDUNSCALE(MEM[P+1].INT);
B:=ROUNDUNSCALE(MEM[P+3].INT);S:=CUREXP;L:=(STRSTART[S+1]-STRSTART[S]);
IF A<0 THEN A:=0;IF B>L THEN B:=L;
IF A<B THEN BEGIN BEGIN IF POOLPTR+B-A>POOLSIZE THEN OVERFLOW(129,
POOLSIZE-INITPOOLPTR);END;
FOR K:=STRSTART[S]+A TO STRSTART[S]+B-1 DO BEGIN STRPOOL[POOLPTR]:=
STRPOOL[K];POOLPTR:=POOLPTR+1;END;END;CUREXP:=MAKESTRING;
BEGIN IF STRREF[S]<127 THEN IF STRREF[S]>1 THEN STRREF[S]:=STRREF[S]-1
ELSE FLUSHSTRING(S);END;END;{:911}{912:}PROCEDURE CHOPPATH(P:HALFWORD);
VAR Q:HALFWORD;PP,QQ,RR,SS:HALFWORD;A,B,L:SCALED;BEGIN L:=PATHLENGTH;
A:=MEM[P+1].INT;B:=MEM[P+3].INT;{913:}
IF A<0 THEN IF MEM[CUREXP].HH.B0=0 THEN A:=0 ELSE REPEAT A:=A+L;B:=B+L;
UNTIL A>=0;IF B>L THEN IF MEM[CUREXP].HH.B0=0 THEN B:=L{:913};Q:=CUREXP;
WHILE A>=65536 DO BEGIN Q:=MEM[Q].HH.RH;A:=A-65536;B:=B-65536;END;
IF B<=A THEN{915:}BEGIN IF A>0 THEN BEGIN MEM[MEM[Q].HH.RH].HH.B1:=1;
SPLITCUBIC(Q,A*4096);Q:=MEM[Q].HH.RH;END;PP:=COPYKNOT(Q);QQ:=PP;
END{:915}ELSE{914:}BEGIN PP:=COPYKNOT(Q);QQ:=PP;REPEAT Q:=MEM[Q].HH.RH;
RR:=QQ;QQ:=COPYKNOT(Q);MEM[RR].HH.RH:=QQ;B:=B-65536;UNTIL B<=0;
IF A>0 THEN BEGIN MEM[MEM[PP].HH.RH].HH.B1:=1;SPLITCUBIC(PP,A*4096);
SS:=PP;PP:=MEM[PP].HH.RH;FREENODE(SS,7);
IF RR=SS THEN BEGIN B:=MAKESCALED(B,65536-A);RR:=PP;END;END;
IF B<0 THEN BEGIN MEM[QQ].HH.B1:=1;SPLITCUBIC(RR,(B+65536)*4096);
FREENODE(QQ,7);QQ:=MEM[RR].HH.RH;END;END{:914};MEM[PP].HH.B0:=0;
MEM[QQ].HH.B1:=0;MEM[QQ].HH.RH:=PP;TOSSKNOTLIST(CUREXP);CUREXP:=PP;END;
{:912}{916:}PROCEDURE PAIRVALUE(X,Y:SCALED);VAR P:HALFWORD;
BEGIN P:=GETNODE(2);FLUSHCUREXP(P);CURTYPE:=15;MEM[P].HH.B0:=15;
MEM[P].HH.B1:=11;INITBIGNODE(P);P:=MEM[P+1].INT;MEM[P].HH.B0:=16;
MEM[P+1].INT:=X;MEM[P+2].HH.B0:=16;MEM[P+3].INT:=Y;END;{:916}{918:}
PROCEDURE SETUPOFFSET(P:HALFWORD);
BEGIN FINDOFFSET(MEM[P+1].INT,MEM[P+3].INT,CUREXP);PAIRVALUE(CURX,CURY);
END;PROCEDURE SETUPDIRECTI(P:HALFWORD);
BEGIN FLUSHCUREXP(FINDDIRECTIO(MEM[P+1].INT,MEM[P+3].INT,CUREXP));END;
{:918}{919:}PROCEDURE FINDPOINT(V:SCALED;C:QUARTERWORD);LABEL 45,10;
VAR P:HALFWORD;N:SCALED;VV:SCALED;BEGIN VV:=V;P:=CUREXP;
IF MEM[P].HH.B0=0 THEN N:=-65536 ELSE N:=0;REPEAT P:=MEM[P].HH.RH;
N:=N+65536;UNTIL P=CUREXP;
IF(V<0)OR(V>N)THEN IF MEM[P].HH.B0=0 THEN GOTO 45 ELSE IF N=0 THEN V:=0
ELSE IF V<0 THEN V:=N-1-((-V-1)MOD N)ELSE V:=V MOD N;P:=CUREXP;
WHILE V>=65536 DO BEGIN P:=MEM[P].HH.RH;V:=V-65536;END;
IF V<>0 THEN{921:}BEGIN MEM[MEM[P].HH.RH].HH.B1:=1;SPLITCUBIC(P,V*4096);
P:=MEM[P].HH.RH;END{:921};{922:}
CASE C OF 93:PAIRVALUE(MEM[P+1].INT,MEM[P+2].INT);
94:IF MEM[P].HH.B0=0 THEN GOTO 45 ELSE PAIRVALUE(MEM[P+3].INT,MEM[P+4].
INT);
95:IF MEM[P].HH.B1=0 THEN GOTO 45 ELSE PAIRVALUE(MEM[P+5].INT,MEM[P+6].
INT);END;GOTO 10{:922};45:{920:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(716);
END;PRINTOP(C);PRINTCHAR(32);PRINTSCALED(VV);BEGIN HELPPTR:=2;
HELPLINE[1]:=717;HELPLINE[0]:=718;END;PUTGETERROR;PAIRVALUE(0,0);
GOTO 10;END{:920};10:END;{:919}PROCEDURE DOBINARY(P:HALFWORD;
C:QUARTERWORD);LABEL 30,10;VAR Q,R,S:HALFWORD;V:INTEGER;
BEGIN BEGIN IF ARITHERROR THEN CLEARARITH;END;
IF INTERNAL[6]>131072 THEN{863:}BEGIN BEGINDIAGNOS;PRINTNL(697);
PRINTEXP(P,0);PRINTCHAR(41);PRINTOP(C);PRINTCHAR(40);PRINTEXP(0,0);
PRINT(689);ENDDIAGNOSTI(FALSE);END{:863};CASE C OF 65,66:{864:}
IF(CURTYPE<15)OR(MEM[P].HH.B0<15)THEN BADBINARY(P,C)ELSE IF CURTYPE=15
THEN IF MEM[P].HH.B0<>15 THEN BADBINARY(P,C)ELSE BEGIN Q:=MEM[P+1].INT;
R:=MEM[CUREXP+1].INT;ADDORSUBTRAC(Q,R,C);ADDORSUBTRAC(Q+2,R+2,C);
END ELSE IF MEM[P].HH.B0=15 THEN BADBINARY(P,C)ELSE ADDORSUBTRAC(P,0,C){
:864};{872:}
72,73,74,75,76,77:BEGIN IF(CURTYPE>15)AND(MEM[P].HH.B0>15)THEN
ADDORSUBTRAC(P,0,66)ELSE IF CURTYPE<>MEM[P].HH.B0 THEN BEGIN BADBINARY(P
,C);GOTO 30;
END ELSE IF CURTYPE=4 THEN FLUSHCUREXP(STRVSSTR(MEM[P+1].INT,CUREXP))
ELSE IF(CURTYPE=5)OR(CURTYPE=3)THEN{874:}BEGIN Q:=MEM[CUREXP+1].INT;
WHILE(Q<>CUREXP)AND(Q<>P)DO Q:=MEM[Q+1].INT;IF Q=P THEN FLUSHCUREXP(0);
END{:874}ELSE IF CURTYPE=15 THEN{875:}BEGIN Q:=MEM[P+1].INT;
R:=MEM[CUREXP+1].INT;ADDORSUBTRAC(Q,R,66);
IF MEM[R].HH.B0=16 THEN IF MEM[R+1].INT=0 THEN BEGIN ADDORSUBTRAC(Q+2,R
+2,66);TAKEPART(50);END ELSE TAKEPART(49)ELSE TAKEPART(49);END{:875}
ELSE IF CURTYPE=2 THEN FLUSHCUREXP(CUREXP-MEM[P+1].INT)ELSE BEGIN
BADBINARY(P,C);GOTO 30;END;{873:}
IF CURTYPE<>16 THEN BEGIN IF CURTYPE<16 THEN BEGIN DISPERR(P,311);
BEGIN HELPPTR:=1;HELPLINE[0]:=698;END END ELSE BEGIN HELPPTR:=2;
HELPLINE[1]:=699;HELPLINE[0]:=700;END;DISPERR(0,701);PUTGETFLUSHE(31);
END ELSE CASE C OF 72:IF CUREXP<0 THEN CUREXP:=30 ELSE CUREXP:=31;
73:IF CUREXP<=0 THEN CUREXP:=30 ELSE CUREXP:=31;
74:IF CUREXP>0 THEN CUREXP:=30 ELSE CUREXP:=31;
75:IF CUREXP>=0 THEN CUREXP:=30 ELSE CUREXP:=31;
76:IF CUREXP=0 THEN CUREXP:=30 ELSE CUREXP:=31;
77:IF CUREXP<>0 THEN CUREXP:=30 ELSE CUREXP:=31;END;CURTYPE:=2{:873};
30:END;{:872}{876:}
71,70:IF(MEM[P].HH.B0<>2)OR(CURTYPE<>2)THEN BADBINARY(P,C)ELSE IF MEM[P
+1].INT=C-40 THEN CUREXP:=MEM[P+1].INT;{:876}{877:}
67:IF(CURTYPE<15)OR(MEM[P].HH.B0<15)THEN BADBINARY(P,67)ELSE IF(CURTYPE=
16)OR(MEM[P].HH.B0=16)THEN{878:}
BEGIN IF MEM[P].HH.B0=16 THEN BEGIN V:=MEM[P+1].INT;FREENODE(P,2);
END ELSE BEGIN V:=CUREXP;UNSTASHCUREX(P);END;
IF CURTYPE=16 THEN CUREXP:=TAKESCALED(CUREXP,V)ELSE IF CURTYPE=15 THEN
BEGIN P:=MEM[CUREXP+1].INT;DEPMULT(P,V,TRUE);DEPMULT(P+2,V,TRUE);
END ELSE DEPMULT(0,V,TRUE);GOTO 10;END{:878}
ELSE IF(NICEPAIR(P,MEM[P].HH.B0)AND(CURTYPE>15))OR(NICEPAIR(CUREXP,
CURTYPE)AND(MEM[P].HH.B0>15))THEN BEGIN HARDTIMES(P);GOTO 10;
END ELSE BADBINARY(P,67);{:877}{883:}
68:IF(CURTYPE<>16)OR(MEM[P].HH.B0<15)THEN BADBINARY(P,68)ELSE BEGIN V:=
CUREXP;UNSTASHCUREX(P);IF V=0 THEN{885:}BEGIN DISPERR(0,632);
BEGIN HELPPTR:=2;HELPLINE[1]:=702;HELPLINE[0]:=703;END;PUTGETERROR;
END{:885}
ELSE BEGIN IF CURTYPE=16 THEN CUREXP:=MAKESCALED(CUREXP,V)ELSE IF
CURTYPE=15 THEN BEGIN P:=MEM[CUREXP+1].INT;DEPDIV(P,V);DEPDIV(P+2,V);
END ELSE DEPDIV(0,V);END;GOTO 10;END;{:883}{886:}
69:IF(CURTYPE=16)AND(MEM[P].HH.B0=16)THEN CUREXP:=PYTHADD(MEM[P+1].INT,
CUREXP)ELSE BADBINARY(P,69);{:886}{887:}
80,81,82,83,84,85,86,87:IF(MEM[P].HH.B0=11)OR(MEM[P].HH.B0=8)THEN BEGIN
PATHTRANS(P,C);GOTO 10;
END ELSE IF(MEM[P].HH.B0=15)OR(MEM[P].HH.B0=14)THEN BIGTRANS(P,C)ELSE IF
MEM[P].HH.B0=9 THEN BEGIN EDGESTRANS(P,C);GOTO 10;
END ELSE BADBINARY(P,C);{:887}{909:}
78:IF(CURTYPE=4)AND(MEM[P].HH.B0=4)THEN CAT(P)ELSE BADBINARY(P,78);
90:IF NICEPAIR(P,MEM[P].HH.B0)AND(CURTYPE=4)THEN CHOPSTRING(MEM[P+1].INT
)ELSE BADBINARY(P,90);91:BEGIN IF CURTYPE=15 THEN PAIRTOPATH;
IF NICEPAIR(P,MEM[P].HH.B0)AND(CURTYPE=11)THEN CHOPPATH(MEM[P+1].INT)
ELSE BADBINARY(P,91);END;{:909}{917:}
93,94,95:BEGIN IF CURTYPE=15 THEN PAIRTOPATH;
IF(CURTYPE=11)AND(MEM[P].HH.B0=16)THEN FINDPOINT(MEM[P+1].INT,C)ELSE
BADBINARY(P,C);END;
96:IF(CURTYPE=6)AND NICEPAIR(P,MEM[P].HH.B0)THEN SETUPOFFSET(MEM[P+1].
INT)ELSE BADBINARY(P,96);92:BEGIN IF CURTYPE=15 THEN PAIRTOPATH;
IF(CURTYPE=11)AND NICEPAIR(P,MEM[P].HH.B0)THEN SETUPDIRECTI(MEM[P+1].INT
)ELSE BADBINARY(P,92);END;{:917}{923:}
79:IF(CURTYPE=9)AND(MEM[P].HH.B0=9)THEN BEGIN CUREDGES:=CUREXP;
MERGEEDGES(MEM[P+1].INT);CUREXP:=CUREDGES;END ELSE BADBINARY(P,79);
88:BEGIN IF MEM[P].HH.B0=15 THEN BEGIN Q:=STASHCUREXP;UNSTASHCUREX(P);
PAIRTOPATH;P:=STASHCUREXP;UNSTASHCUREX(Q);END;
IF CURTYPE=15 THEN PAIRTOPATH;
IF(CURTYPE=11)AND(MEM[P].HH.B0=11)THEN BEGIN PATHINTERSEC(MEM[P+1].INT,
CUREXP);PAIRVALUE(CURT,CURTT);END ELSE BADBINARY(P,88);END;{:923}END;
RECYCLEVALUE(P);FREENODE(P,2);10:BEGIN IF ARITHERROR THEN CLEARARITH;
END;END;{:861}{880:}PROCEDURE FRACMULT(V:FRACTION);VAR P:HALFWORD;
BEGIN IF CURTYPE=16 THEN CUREXP:=TAKEFRACTION(CUREXP,V)ELSE IF CURTYPE=
15 THEN BEGIN P:=MEM[CUREXP+1].INT;DEPMULT(P,V,FALSE);
DEPMULT(P+2,V,FALSE);END ELSE DEPMULT(0,V,FALSE);END;{:880}{924:}{1083:}
PROCEDURE ARYOUT(VAR F:FILE;B:PACKEDBYTES;O,C:INTEGER);EXTERN;
PROCEDURE WRITEGF(A,B:GFINDEX);
BEGIN ARYOUT(GFFILE,GFBUF,A DIV 4,(B+1-A)DIV 4);{+1000}END;{:1083}
{1084:}PROCEDURE GFSWAP;
BEGIN IF GFLIMIT=GFBUFSIZE THEN BEGIN WRITEGF(0,HALFBUF-1);
GFLIMIT:=HALFBUF;GFOFFSET:=GFOFFSET+GFBUFSIZE;GFPTR:=0;
END ELSE BEGIN WRITEGF(HALFBUF,GFBUFSIZE-1);GFLIMIT:=GFBUFSIZE;END;END;
{:1084}{1086:}PROCEDURE GFFOUR(X:INTEGER);
BEGIN IF X>=0 THEN BEGIN GFBUF[GFPTR]:=X DIV 16777216;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END ELSE BEGIN X:=X+1073741824;
X:=X+1073741824;BEGIN GFBUF[GFPTR]:=(X DIV 16777216)+128;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;END;X:=X MOD 16777216;
BEGIN GFBUF[GFPTR]:=X DIV 65536;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;X:=X MOD 65536;
BEGIN GFBUF[GFPTR]:=X DIV 256;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=X MOD 256;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;END;{:1086}{1087:}
PROCEDURE GFTWO(X:INTEGER);BEGIN BEGIN GFBUF[GFPTR]:=X DIV 256;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=X MOD 256;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;END;PROCEDURE GFTHREE(X:INTEGER);
BEGIN BEGIN GFBUF[GFPTR]:=X DIV 65536;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=(X MOD 65536)DIV 256;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=X MOD 256;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;END;{:1087}{1088:}
PROCEDURE GFPAINT(D:INTEGER);BEGIN IF D<64 THEN BEGIN GFBUF[GFPTR]:=0+D;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;
END ELSE IF D<256 THEN BEGIN BEGIN GFBUF[GFPTR]:=64;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=D;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;END ELSE BEGIN BEGIN GFBUF[GFPTR]:=65;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;GFTWO(D);END;END;
PROCEDURE GFNEWROW(D:INTEGER);
BEGIN IF ABS(D)<=82 THEN BEGIN GFBUF[GFPTR]:=156+D;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END ELSE BEGIN BEGIN GFBUF[GFPTR]:=72;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(D);END;END;
{:1088}{1089:}PROCEDURE GFSTRING(S:STRNUMBER);VAR K:POOLPOINTER;
BEGIN FOR K:=STRSTART[S]TO STRSTART[S+1]-1 DO BEGIN GFBUF[GFPTR]:=
STRPOOL[K];GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;END;{:1089}
{1090:}PROCEDURE INITGF;VAR K:EIGHTBITS;T:INTEGER;
BEGIN GFMINX:=2147483647;GFMAXX:=-2147483647;GFMINY:=2147483647;
GFMAXY:=-2147483647;FOR K:=0 TO 255 DO CHARPTR[K]:=-1;
BEGIN IF JOBNAME=0 THEN OPENLOGFILE;PACKJOBNAME(605);
WHILE NOT BOPENOUT(GFFILE)DO PROMPTFILENA(606,605);
OUTPUTFILENA:=BMAKENAMESTR(GFFILE);END;BEGIN GFBUF[GFPTR]:=247;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=129;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;OLDSETTING:=SELECTOR;
SELECTOR:=5;PRINT(893);PRINTINT(ROUNDUNSCALE(INTERNAL[12]));
PRINTCHAR(46);PRINTDD(ROUNDUNSCALE(INTERNAL[13]));PRINTCHAR(46);
PRINTDD(ROUNDUNSCALE(INTERNAL[14]));PRINTCHAR(58);
T:=ROUNDUNSCALE(INTERNAL[15]);PRINTDD(T DIV 60);PRINTDD(T MOD 60);
SELECTOR:=OLDSETTING;BEGIN GFBUF[GFPTR]:=(POOLPTR-STRSTART[STRPTR]);
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
STRSTART[STRPTR+1]:=POOLPTR;GFSTRING(STRPTR);POOLPTR:=STRSTART[STRPTR];
GFPREVPTR:=GFOFFSET+GFPTR;END;{:1090}{1091:}
PROCEDURE SHIPOUT(C:EIGHTBITS);VAR F:INTEGER;PREVM,M,MM:INTEGER;
MMM:INTEGER;PREVN,N:INTEGER;P,Q:HALFWORD;PREVW,W,WW:INTEGER;D:INTEGER;
DELTA:INTEGER;Z:INTEGER;BEGIN IF OUTPUTFILENA=0 THEN INITGF;
F:=ROUNDUNSCALE(INTERNAL[17]);BEGIN GFBUF[GFPTR]:=67;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(256*F+C);GFFOUR(CHARPTR[C]);
CHARPTR[C]:=GFPREVPTR;{1092:}PREVN:=4096;P:=MEM[CUREDGES].HH.LH;
N:=MEM[CUREDGES+1].HH.RH-4096;WHILE P<>CUREDGES DO BEGIN{1093:}
IF MEM[P+1].HH.LH>1 THEN SORTEDGES(P);Q:=MEM[P+1].HH.RH;W:=0;
PREVM:=-268435456;WW:=0;PREVW:=0;M:=PREVM;
REPEAT IF Q=2500 THEN MM:=268435456 ELSE BEGIN D:=0+MEM[Q].HH.LH-0;
MM:=D DIV 8;WW:=WW+(D MOD 8)-4;END;
IF MM<>M THEN BEGIN IF PREVW<=0 THEN BEGIN IF W>0 THEN{1094:}
BEGIN IF PREVM=-268435456 THEN{1096:}BEGIN MMM:=M-MEM[CUREDGES+3].HH.LH;
IF MMM<GFMINX THEN GFMINX:=MMM;
IF PREVN=4096 THEN BEGIN IF N>GFMAXY THEN GFMAXY:=N;
GFFOUR(MEM[CUREDGES+2].HH.LH-4096);GFFOUR(MEM[CUREDGES+2].HH.RH-4097);
GFFOUR(MEM[CUREDGES+1].HH.LH-4096);GFFOUR(N);GFFOUR(MMM);
END ELSE IF PREVN>N+1 THEN{1097:}BEGIN DELTA:=PREVN-N-1;
IF M<>Z THEN BEGIN GFNEWROW(M-Z);DELTA:=DELTA-1;END;
IF DELTA<256 THEN BEGIN BEGIN GFBUF[GFPTR]:=69;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=DELTA;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
END ELSE BEGIN BEGIN GFBUF[GFPTR]:=70;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GFTWO(DELTA);END;END{:1097}
ELSE GFNEWROW(M-Z);Z:=M;PREVN:=N;END{:1096}ELSE GFPAINT(M-PREVM);
PREVM:=M;PREVW:=W;END{:1094};END ELSE IF W<=0 THEN{1095:}
BEGIN GFPAINT(M-PREVM);PREVM:=M;PREVW:=W;END{:1095};M:=MM;END;W:=WW;
Q:=MEM[Q].HH.RH;UNTIL MM=268435456;IF W<>0 THEN PRINTNL(895);
IF PREVM-MEM[CUREDGES+3].HH.LH>GFMAXX THEN GFMAXX:=PREVM-MEM[CUREDGES+3]
.HH.LH{:1093};P:=MEM[P].HH.LH;N:=N-1;END;
IF PREVN=4096 THEN FOR N:=1 TO 20 DO BEGIN GFBUF[GFPTR]:=0;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;
END ELSE IF PREVN<GFMINY THEN GFMINY:=PREVN{:1092};
BEGIN GFBUF[GFPTR]:=68;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
GFPREVPTR:=GFOFFSET+GFPTR;TOTALCHARS:=TOTALCHARS+1;
IF INTERNAL[9]>0 THEN PRINTEDGES(CUREDGES,894);END;{:1091}{930:}{941:}
PROCEDURE TRYEQ(L,R:HALFWORD);LABEL 30,31;VAR P:HALFWORD;T:16..18;
Q:HALFWORD;PP:HALFWORD;TT:17..18;BEGIN{942:}T:=MEM[L].HH.B0;
IF T=16 THEN BEGIN T:=17;P:=CONSTDEPENDE(-MEM[L+1].INT);Q:=P;
END ELSE BEGIN P:=MEM[L+1].HH.RH;Q:=P;
WHILE TRUE DO BEGIN MEM[Q+1].INT:=-MEM[Q+1].INT;
IF MEM[Q].HH.LH=0 THEN GOTO 30;Q:=MEM[Q].HH.RH;END;
30:MEM[MEM[L+1].HH.LH].HH.RH:=MEM[Q].HH.RH;
MEM[MEM[Q].HH.RH+1].HH.LH:=MEM[L+1].HH.LH;MEM[L].HH.B0:=16;END{:942};
{944:}
IF R=0 THEN IF CURTYPE=16 THEN BEGIN MEM[Q+1].INT:=MEM[Q+1].INT+CUREXP;
GOTO 31;END ELSE BEGIN PP:=MEM[CUREXP+1].HH.RH;TT:=CURTYPE;
END ELSE IF MEM[R].HH.B0=16 THEN BEGIN MEM[Q+1].INT:=MEM[Q+1].INT+MEM[R
+1].INT;GOTO 31;END ELSE BEGIN PP:=MEM[R+1].HH.RH;TT:=MEM[R].HH.B0;END;
WATCHCOEFS:=FALSE;
IF T=TT THEN P:=PPLUSQ(P,PP,T)ELSE IF T=18 THEN P:=PPLUSFQ(P,65536,PP,18
,17)ELSE BEGIN Q:=P;
WHILE MEM[Q].HH.LH<>0 DO BEGIN MEM[Q+1].INT:=ROUNDFRACTIO(MEM[Q+1].INT);
Q:=MEM[Q].HH.RH;END;T:=18;P:=PPLUSQ(P,PP,T);END;WATCHCOEFS:=TRUE;
31:{:944};IF MEM[P].HH.LH=0 THEN{943:}
BEGIN IF MEM[P+1].INT<>0 THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(747);END;PRINT(749);
PRINTSCALED(MEM[P+1].INT);PRINTCHAR(41);BEGIN HELPPTR:=2;
HELPLINE[1]:=748;HELPLINE[0]:=746;END;PUTGETERROR;
END ELSE IF R=0 THEN{572:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(439);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=440;HELPLINE[0]:=441;END;PUTGETERROR;
END{:572};FREENODE(P,2);END{:943}ELSE BEGIN LINEAREQ(P,T);
IF R=0 THEN IF CURTYPE<>16 THEN IF MEM[CUREXP].HH.B0=16 THEN BEGIN PP:=
CUREXP;CUREXP:=MEM[CUREXP+1].INT;CURTYPE:=16;FREENODE(PP,2);END;END;END;
{:941}{936:}PROCEDURE MAKEEQ(LHS:HALFWORD);LABEL 20,10,45;
VAR T:SMALLNUMBER;V:INTEGER;P,Q:HALFWORD;BEGIN 20:T:=MEM[LHS].HH.B0;
IF T<=15 THEN V:=MEM[LHS+1].INT;CASE T OF{938:}
2,4,6,9,11:IF CURTYPE=T+1 THEN BEGIN NONLINEAREQ(V,CUREXP,FALSE);
GOTO 10;END ELSE IF CURTYPE=T THEN{939:}
BEGIN IF CURTYPE<=4 THEN BEGIN IF CURTYPE=4 THEN BEGIN IF STRVSSTR(V,
CUREXP)<>0 THEN GOTO 45;END ELSE IF V<>CUREXP THEN GOTO 45;{572:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(439);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=440;HELPLINE[0]:=441;END;PUTGETERROR;
END{:572};GOTO 10;END;BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(744);END;BEGIN HELPPTR:=2;HELPLINE[1]:=745;
HELPLINE[0]:=746;END;PUTGETERROR;GOTO 10;
45:BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(747);END;
BEGIN HELPPTR:=2;HELPLINE[1]:=748;HELPLINE[0]:=746;END;PUTGETERROR;
GOTO 10;END{:939};
3,5,7,10,12:IF CURTYPE=T-1 THEN BEGIN NONLINEAREQ(CUREXP,LHS,TRUE);
GOTO 10;END ELSE IF CURTYPE=T THEN BEGIN RINGMERGE(LHS,CUREXP);GOTO 10;
END ELSE IF CURTYPE=15 THEN IF T=12 THEN BEGIN PAIRTOPATH;GOTO 20;END;
14,15:IF CURTYPE=T THEN{940:}BEGIN P:=V+BIGNODESIZE[T];
Q:=MEM[CUREXP+1].INT+BIGNODESIZE[T];REPEAT P:=P-2;Q:=Q-2;TRYEQ(P,Q);
UNTIL P=V;GOTO 10;END{:940};
16,17,18:IF CURTYPE>=16 THEN BEGIN TRYEQ(LHS,0);GOTO 10;END;1:;{:938}
END;{937:}DISPERR(LHS,311);DISPERR(0,741);
IF MEM[LHS].HH.B0<=15 THEN PRINTTYPE(MEM[LHS].HH.B0)ELSE PRINT(215);
PRINTCHAR(61);IF CURTYPE<=15 THEN PRINTTYPE(CURTYPE)ELSE PRINT(215);
PRINTCHAR(41);BEGIN HELPPTR:=2;HELPLINE[1]:=742;HELPLINE[0]:=743;END;
PUTGETERROR{:937};10:BEGIN IF ARITHERROR THEN CLEARARITH;END;END;{:936}
PROCEDURE DOASSIGNMENT;FORWARD;PROCEDURE DOEQUATION;VAR LHS:HALFWORD;
P:HALFWORD;BEGIN LHS:=STASHCUREXP;GETXNEXT;VARFLAG:=76;SCANEXPRESSI;
IF CURCMD=50 THEN DOEQUATION ELSE IF CURCMD=76 THEN DOASSIGNMENT;
IF INTERNAL[6]>131072 THEN{932:}BEGIN BEGINDIAGNOS;PRINTNL(697);
PRINTEXP(LHS,0);PRINT(736);PRINTEXP(0,0);PRINT(689);ENDDIAGNOSTI(FALSE);
END{:932};
IF CURTYPE=12 THEN IF MEM[LHS].HH.B0=15 THEN BEGIN P:=STASHCUREXP;
UNSTASHCUREX(LHS);LHS:=P;END;MAKEEQ(LHS);RECYCLEVALUE(LHS);
FREENODE(LHS,2);END;{:930}{931:}PROCEDURE DOASSIGNMENT;VAR LHS:HALFWORD;
P:HALFWORD;Q:HALFWORD;BEGIN IF CURTYPE<>21 THEN BEGIN DISPERR(0,733);
BEGIN HELPPTR:=2;HELPLINE[1]:=734;HELPLINE[0]:=735;END;ERROR;DOEQUATION;
END ELSE BEGIN LHS:=CUREXP;CURTYPE:=1;GETXNEXT;VARFLAG:=76;SCANEXPRESSI;
IF CURCMD=50 THEN DOEQUATION ELSE IF CURCMD=76 THEN DOASSIGNMENT;
IF INTERNAL[6]>131072 THEN{933:}BEGIN BEGINDIAGNOS;PRINTNL(123);
IF MEM[LHS].HH.LH>2243 THEN PRINT(INTNAME[MEM[LHS].HH.LH-(2243)])ELSE
SHOWTOKENLIS(LHS,0,1000);PRINT(322);PRINTEXP(0,0);PRINTCHAR(125);
ENDDIAGNOSTI(FALSE);END{:933};IF MEM[LHS].HH.LH>2243 THEN{934:}
IF CURTYPE=16 THEN INTERNAL[MEM[LHS].HH.LH-(2243)]:=CUREXP ELSE BEGIN
DISPERR(0,737);PRINT(INTNAME[MEM[LHS].HH.LH-(2243)]);PRINT(738);
BEGIN HELPPTR:=2;HELPLINE[1]:=739;HELPLINE[0]:=740;END;PUTGETERROR;
END{:934}ELSE{935:}BEGIN P:=FINDVARIABLE(LHS);
IF P<>0 THEN BEGIN Q:=STASHCUREXP;CURTYPE:=UNDTYPE(P);RECYCLEVALUE(P);
MEM[P].HH.B0:=CURTYPE;MEM[P+1].INT:=0;MAKEEXPCOPY(P);P:=STASHCUREXP;
UNSTASHCUREX(Q);MAKEEQ(P);END ELSE BEGIN OBLITERATED(LHS);PUTGETERROR;
END;END{:935};FLUSHNODELIS(LHS);END;END;{:931}{949:}
PROCEDURE DOTYPEDECLAR;VAR T:SMALLNUMBER;P:HALFWORD;Q:HALFWORD;
BEGIN IF CURMOD>=14 THEN T:=CURMOD ELSE T:=CURMOD+1;
REPEAT P:=SCANDECLARED;
FLUSHVARIABL(EQTB[MEM[P].HH.LH].RH,MEM[P].HH.RH,FALSE);
Q:=FINDVARIABLE(P);MEM[Q].HH.B0:=T;MEM[Q+1].INT:=0;FLUSHLIST(P);
IF CURCMD<78 THEN{950:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(750);END;BEGIN HELPPTR:=5;HELPLINE[4]:=751;
HELPLINE[3]:=752;HELPLINE[2]:=753;HELPLINE[1]:=754;HELPLINE[0]:=755;END;
IF CURCMD=41 THEN HELPLINE[2]:=756;PUTGETERROR;SCANNERSTATU:=2;
REPEAT GETNEXT;{690:}
IF CURCMD=40 THEN BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1
THEN STRREF[CURMOD]:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END{:690}
;UNTIL CURCMD>=78;SCANNERSTATU:=0;END{:950};UNTIL CURCMD>78;END;{:949}
{955:}PROCEDURE DORANDOMSEED;BEGIN GETXNEXT;
IF CURCMD<>76 THEN BEGIN MISSINGERR(322);BEGIN HELPPTR:=1;
HELPLINE[0]:=761;END;BACKERROR;END;GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>16 THEN BEGIN DISPERR(0,762);BEGIN HELPPTR:=2;
HELPLINE[1]:=763;HELPLINE[0]:=764;END;PUTGETFLUSHE(0);
END ELSE INITRANDOMS(CUREXP);END;{:955}{962:}PROCEDURE DOPROTECTION;
VAR M:0..1;T:HALFWORD;BEGIN M:=CURMOD;REPEAT GETSYMBOL;
T:=EQTB[CURSYM].LH;
IF M=0 THEN BEGIN IF T>=82 THEN EQTB[CURSYM].LH:=T-82;
END ELSE IF T<82 THEN EQTB[CURSYM].LH:=T+82;GETNEXT;UNTIL CURCMD<>78;
END;{:962}{964:}PROCEDURE DEFDELIMS;VAR LDELIM,RDELIM:HALFWORD;
BEGIN GETCLEARSYMB;LDELIM:=CURSYM;GETCLEARSYMB;RDELIM:=CURSYM;
EQTB[LDELIM].LH:=30;EQTB[LDELIM].RH:=RDELIM;EQTB[RDELIM].LH:=62;
EQTB[RDELIM].RH:=LDELIM;GETNEXT;END;{:964}{967:}PROCEDURE DOSTATEMENT;
FORWARD;PROCEDURE DOINTERIM;BEGIN GETNEXT;
IF CURCMD<>37 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(770);END;PRINTCMDMOD(CURCMD,CURMOD);PRINT(775);
BEGIN HELPPTR:=1;HELPLINE[0]:=776;END;BACKERROR;
END ELSE BEGIN SAVEINTERNAL(CURMOD);BACKINPUT;END;DOSTATEMENT;END;{:967}
{968:}PROCEDURE DOLET;VAR L:HALFWORD;BEGIN GETSYMBOL;L:=CURSYM;GETNEXT;
IF(CURCMD<>50)AND(CURCMD<>76)THEN BEGIN MISSINGERR(61);BEGIN HELPPTR:=3;
HELPLINE[2]:=777;HELPLINE[1]:=518;HELPLINE[0]:=778;END;BACKERROR;END;
GETSYMBOL;
CASE CURCMD OF 8,53,43,48:MEM[CURMOD].HH.LH:=MEM[CURMOD].HH.LH+1;
OTHERS:END;CLEARSYMBOL(L,FALSE);EQTB[L].LH:=CURCMD;
IF CURCMD=39 THEN EQTB[L].RH:=0 ELSE EQTB[L].RH:=CURMOD;GETNEXT;END;
{:968}{969:}PROCEDURE DONEWINTERNA;
BEGIN REPEAT IF INTPTR=MAXINTERNAL THEN OVERFLOW(779,MAXINTERNAL);
GETCLEARSYMB;INTPTR:=INTPTR+1;EQTB[CURSYM].LH:=37;
EQTB[CURSYM].RH:=INTPTR;INTNAME[INTPTR]:=HASH[CURSYM].RH;
INTERNAL[INTPTR]:=0;GETNEXT;UNTIL CURCMD<>78;END;{:969}{973:}
PROCEDURE DOSHOW;VAR VERBOSITY:SMALLNUMBER;BEGIN VERBOSITY:=CURMOD-1;
REPEAT GETXNEXT;SCANEXPRESSI;PRINTNL(615);PRINTEXP(0,VERBOSITY);
FLUSHCUREXP(0);UNTIL CURCMD<>78;END;{:973}{974:}PROCEDURE DISPTOKEN;
BEGIN PRINTNL(789);IF CURSYM=0 THEN{975:}
BEGIN IF CURCMD=41 THEN PRINTSCALED(CURMOD)ELSE BEGIN PRINTCHAR(34);
PRINT(CURMOD);PRINTCHAR(34);
BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1 THEN STRREF[CURMOD]
:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END;END;END{:975}
ELSE IF CURSYM>2243 THEN PRINT(790)ELSE BEGIN PRINT(HASH[CURSYM].RH);
PRINTCHAR(61);IF EQTB[CURSYM].LH>=82 THEN PRINT(791);
PRINTCMDMOD(CURCMD,CURMOD);IF CURCMD=8 THEN BEGIN PRINTLN;
SHOWMACRO(CURMOD,0,100000);END;END;END;{:974}{977:}
PROCEDURE DOSHOWTOKEN;BEGIN REPEAT GETNEXT;DISPTOKEN;GETNEXT;
UNTIL CURCMD<>78;END;{:977}{978:}PROCEDURE DOSHOWSTATS;
BEGIN PRINTNL(800);PRINTINT(VARUSED);PRINTCHAR(38);PRINTINT(DYNUSED);
PRINT(801);PRINTINT(MAXVARUSED);PRINTCHAR(38);PRINTINT(MEMEND-2499);
PRINTCHAR(41);IF FALSE THEN PRINT(802);PRINT(803);
PRINTINT(STRPTR-INITSTRPTR);PRINTCHAR(38);PRINTINT(POOLPTR-INITPOOLPTR);
GETNEXT;END;{:978}{979:}PROCEDURE DISPVAR(P:HALFWORD);VAR Q:HALFWORD;
N:0..MAXPRINTLINE;BEGIN IF MEM[P].HH.B0=22 THEN{980:}
BEGIN Q:=MEM[P+1].HH.LH;REPEAT DISPVAR(Q);Q:=MEM[Q].HH.RH;UNTIL Q=22;
Q:=MEM[P+1].HH.RH;WHILE MEM[Q].HH.B1=3 DO BEGIN DISPVAR(Q);
Q:=MEM[Q].HH.RH;END;END{:980}ELSE IF MEM[P].HH.B0>=23 THEN{981:}
BEGIN PRINTNL(311);PRINTVARIABL(P);IF MEM[P].HH.B0>23 THEN PRINT(511);
PRINT(804);
IF FILEOFFSET>=MAXPRINTLINE-20 THEN N:=5 ELSE N:=MAXPRINTLINE-FILEOFFSET
-15;SHOWMACRO(MEM[P+1].INT,0,N);END{:981}
ELSE IF MEM[P].HH.B0<>0 THEN BEGIN PRINTNL(311);PRINTVARIABL(P);
PRINTCHAR(61);PRINTEXP(P,0);END;END;{:979}{982:}PROCEDURE DOSHOWVAR;
LABEL 30;BEGIN REPEAT GETNEXT;
IF CURSYM>0 THEN IF CURSYM<=2243 THEN IF CURCMD=39 THEN IF CURMOD<>0
THEN BEGIN DISPVAR(CURMOD);GOTO 30;END;DISPTOKEN;30:GETNEXT;
UNTIL CURCMD<>78;END;{:982}{983:}PROCEDURE DOSHOWDEPEND(M:SMALLNUMBER);
VAR P:HALFWORD;BEGIN P:=MEM[13].HH.RH;
WHILE P<>13 DO BEGIN IF(MEM[P].HH.B1<>11)OR(M=6)THEN BEGIN PRINTNL(311);
PRINTVARIABL(P);IF MEM[P].HH.B0=17 THEN PRINTCHAR(61)ELSE PRINT(805);
PRINTDEPENDE(MEM[P+1].HH.RH,MEM[P].HH.B0);END;P:=MEM[P+1].HH.RH;
WHILE MEM[P].HH.LH<>0 DO P:=MEM[P].HH.RH;P:=MEM[P].HH.RH;END;GETNEXT;
END;{:983}{986:}PROCEDURE FINDEDGESVAR(T:HALFWORD);VAR P:HALFWORD;
BEGIN P:=FINDVARIABLE(T);CUREDGES:=0;IF P=0 THEN BEGIN OBLITERATED(T);
PUTGETERROR;
END ELSE IF MEM[P].HH.B0<>9 THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(442);END;SHOWTOKENLIS(T,0,1000);
PRINT(811);PRINTTYPE(MEM[P].HH.B0);PRINTCHAR(41);BEGIN HELPPTR:=2;
HELPLINE[1]:=812;HELPLINE[0]:=813;END;PUTGETERROR;
END ELSE CUREDGES:=MEM[P+1].INT;FLUSHNODELIS(T);END;{:986}{988:}
PROCEDURE DOADDTO;LABEL 30,45;VAR LHS,RHS:HALFWORD;M:SMALLNUMBER;
T:SMALLNUMBER;W,WW:INTEGER;PEN:HALFWORD;P:HALFWORD;Q:HALFWORD;
BEGIN GETXNEXT;VARFLAG:=66;SCANPRIMARY;IF CURTYPE<>21 THEN{989:}
BEGIN DISPERR(0,814);BEGIN HELPPTR:=4;HELPLINE[3]:=815;HELPLINE[2]:=816;
HELPLINE[1]:=817;HELPLINE[0]:=813;END;PUTGETFLUSHE(0);END{:989}
ELSE BEGIN LHS:=CUREXP;M:=CURMOD;CURTYPE:=1;GETXNEXT;SCANEXPRESSI;
IF M=2 THEN{990:}BEGIN FINDEDGESVAR(LHS);
IF CUREDGES=0 THEN FLUSHCUREXP(0)ELSE IF CURTYPE<>9 THEN BEGIN DISPERR(0
,818);BEGIN HELPPTR:=2;HELPLINE[1]:=819;HELPLINE[0]:=813;END;
PUTGETFLUSHE(0);END ELSE BEGIN MERGEEDGES(CUREXP);FLUSHCUREXP(0);END;
END{:990}ELSE{991:}BEGIN IF CURTYPE=15 THEN PAIRTOPATH;
IF CURTYPE<>11 THEN BEGIN DISPERR(0,818);BEGIN HELPPTR:=2;
HELPLINE[1]:=820;HELPLINE[0]:=813;END;PUTGETFLUSHE(0);
END ELSE BEGIN RHS:=CUREXP;W:=1;PEN:=3;
WHILE CURCMD=65 DO BEGIN T:=CURMOD;CURTYPE:=1;GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>T THEN{992:}BEGIN DISPERR(0,821);BEGIN HELPPTR:=2;
HELPLINE[1]:=822;HELPLINE[0]:=823;END;IF T=6 THEN HELPLINE[1]:=824;
PUTGETFLUSHE(0);END{:992}ELSE IF T=16 THEN{993:}
BEGIN WW:=ROUNDUNSCALE(CUREXP);
IF(ABS(WW)<4)AND(WW<>0)THEN W:=WW ELSE BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(825);END;BEGIN HELPPTR:=1;
HELPLINE[0]:=823;END;PUTGETFLUSHE(0);END;END{:993}ELSE{994:}
BEGIN IF MEM[PEN].HH.LH=0 THEN TOSSPEN(PEN)ELSE MEM[PEN].HH.LH:=MEM[PEN]
.HH.LH-1;PEN:=CUREXP;END{:994};END;{995:}FINDEDGESVAR(LHS);
IF CUREDGES=0 THEN TOSSKNOTLIST(RHS)ELSE BEGIN LHS:=0;
IF MEM[RHS].HH.B0=0 THEN IF M=1 THEN{996:}
IF MEM[RHS].HH.RH=RHS THEN{997:}BEGIN MEM[RHS+5].INT:=MEM[RHS+1].INT;
MEM[RHS+6].INT:=MEM[RHS+2].INT;MEM[RHS+3].INT:=MEM[RHS+1].INT;
MEM[RHS+4].INT:=MEM[RHS+2].INT;MEM[RHS].HH.B0:=1;MEM[RHS].HH.B1:=1;
END{:997}ELSE BEGIN P:=HTAPYPOC(RHS);Q:=MEM[P].HH.RH;
MEM[PATHTAIL+5].INT:=MEM[Q+5].INT;MEM[PATHTAIL+6].INT:=MEM[Q+6].INT;
MEM[PATHTAIL].HH.B1:=MEM[Q].HH.B1;MEM[PATHTAIL].HH.RH:=MEM[Q].HH.RH;
FREENODE(Q,7);MEM[P+5].INT:=MEM[RHS+5].INT;MEM[P+6].INT:=MEM[RHS+6].INT;
MEM[P].HH.B1:=MEM[RHS].HH.B1;MEM[P].HH.RH:=MEM[RHS].HH.RH;
FREENODE(RHS,7);RHS:=P;END{:996}ELSE{998:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(826);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=827;HELPLINE[0]:=813;END;PUTGETERROR;
TOSSKNOTLIST(RHS);GOTO 45;END{:998}ELSE IF M=1 THEN LHS:=HTAPYPOC(RHS);
CURWT:=W;RHS:=MAKESPEC(RHS,MEM[PEN+9].INT);{999:}
IF WINDINGNUMBE<=0 THEN IF INTERNAL[31]>0 THEN IF(WINDINGNUMBE<0)AND(PEN
=3)THEN CURWT:=-CURWT ELSE BEGIN IF WINDINGNUMBE=0 THEN IF(INTERNAL[31]
<=65536)AND(PEN=3)THEN GOTO 30 ELSE BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(828);
END ELSE BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(829);END;BEGIN HELPPTR:=2;HELPLINE[1]:=830;HELPLINE[0]:=831;END;
PUTGETERROR;END;30:{:999};
IF PEN=3 THEN FILLSPEC(RHS)ELSE FILLENVELOPE(RHS,PEN);
IF LHS<>0 THEN BEGIN LHS:=MAKESPEC(LHS,MEM[PEN+9].INT);
IF PEN=3 THEN FILLSPEC(LHS)ELSE FILLENVELOPE(LHS,PEN);45:END;END{:995};
IF MEM[PEN].HH.LH=0 THEN TOSSPEN(PEN)ELSE MEM[PEN].HH.LH:=MEM[PEN].HH.LH
-1;END;END{:991};END;END;{:988}{1001:}{1028:}
FUNCTION TFMCHECK(M:SMALLNUMBER):SCALED;
BEGIN IF ABS(INTERNAL[M])>=134217728 THEN BEGIN BEGIN IF INTERACTION=3
THEN WAKEUPTERMIN;PRINTNL(133);PRINT(849);END;PRINT(INTNAME[M]);
PRINT(850);BEGIN HELPPTR:=1;HELPLINE[0]:=851;END;PUTGETERROR;
IF INTERNAL[M]>0 THEN TFMCHECK:=134217727 ELSE TFMCHECK:=-134217727;
END ELSE TFMCHECK:=INTERNAL[M];END;{:1028}PROCEDURE DOSHIPOUT;LABEL 10;
VAR C:INTEGER;BEGIN GETXNEXT;VARFLAG:=79;SCANEXPRESSI;
IF CURTYPE<>21 THEN IF CURTYPE=9 THEN CUREDGES:=CUREXP ELSE BEGIN{989:}
BEGIN DISPERR(0,814);BEGIN HELPPTR:=4;HELPLINE[3]:=815;HELPLINE[2]:=816;
HELPLINE[1]:=817;HELPLINE[0]:=813;END;PUTGETFLUSHE(0);END{:989};GOTO 10;
END ELSE BEGIN FINDEDGESVAR(CUREXP);CURTYPE:=1;END;
IF CUREDGES<>0 THEN BEGIN C:=ROUNDUNSCALE(INTERNAL[16])MOD 256;
IF C<0 THEN C:=C+256;{1029:}IF C<BC THEN BC:=C;IF C>EC THEN EC:=C;
CHAREXISTS[C]:=TRUE;GFWIDTH[C]:=ROUNDUNSCALE(INTERNAL[22]);
TFMWIDTH[C]:=TFMCHECK(18);TFMHEIGHT[C]:=TFMCHECK(19);
TFMDEPTH[C]:=TFMCHECK(20);TFMITALCORR[C]:=TFMCHECK(21){:1029};
IF INTERNAL[28]>=0 THEN SHIPOUT(C);END;FLUSHCUREXP(0);10:END;{:1001}
{1002:}PROCEDURE DODISPLAY;LABEL 45,50,10;VAR E:HALFWORD;BEGIN GETXNEXT;
VARFLAG:=71;SCANPRIMARY;IF CURTYPE<>21 THEN{989:}BEGIN DISPERR(0,814);
BEGIN HELPPTR:=4;HELPLINE[3]:=815;HELPLINE[2]:=816;HELPLINE[1]:=817;
HELPLINE[0]:=813;END;PUTGETFLUSHE(0);END{:989}ELSE BEGIN E:=CUREXP;
CURTYPE:=1;GETXNEXT;SCANEXPRESSI;IF CURTYPE<>16 THEN GOTO 50;
CUREXP:=ROUNDUNSCALE(CUREXP);IF CUREXP<0 THEN GOTO 45;
IF CUREXP>15 THEN GOTO 45;IF NOT WINDOWOPEN[CUREXP]THEN GOTO 45;
FINDEDGESVAR(E);IF CUREDGES<>0 THEN DISPEDGES(CUREXP);GOTO 10;
45:CUREXP:=CUREXP*65536;50:DISPERR(0,832);BEGIN HELPPTR:=1;
HELPLINE[0]:=833;END;PUTGETFLUSHE(0);END;10:END;{:1002}{1003:}
FUNCTION GETPAIR(C:COMMANDCODE):BOOLEAN;VAR P:HALFWORD;B:BOOLEAN;
BEGIN IF CURCMD<>C THEN GETPAIR:=FALSE ELSE BEGIN GETXNEXT;SCANEXPRESSI;
IF NICEPAIR(CUREXP,CURTYPE)THEN BEGIN P:=MEM[CUREXP+1].INT;
CURX:=MEM[P+1].INT;CURY:=MEM[P+3].INT;B:=TRUE;END ELSE B:=FALSE;
FLUSHCUREXP(0);GETPAIR:=B;END;END;{:1003}{1004:}PROCEDURE DOOPENWINDOW;
LABEL 45,10;VAR K:INTEGER;R0,C0,R1,C1:SCALED;BEGIN GETXNEXT;
SCANEXPRESSI;IF CURTYPE<>16 THEN GOTO 45;K:=ROUNDUNSCALE(CUREXP);
IF K<0 THEN GOTO 45;IF K>15 THEN GOTO 45;IF NOT GETPAIR(68)THEN GOTO 45;
R0:=CURX;C0:=CURY;IF NOT GETPAIR(69)THEN GOTO 45;R1:=CURX;C1:=CURY;
IF NOT GETPAIR(70)THEN GOTO 45;OPENAWINDOW(K,R0,C0,R1,C1,CURX,CURY);
GOTO 10;45:BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(834);END;BEGIN HELPPTR:=2;HELPLINE[1]:=835;HELPLINE[0]:=836;END;
PUTGETERROR;10:END;{:1004}{1005:}PROCEDURE DOCULL;LABEL 45,10;
VAR E:HALFWORD;BEGIN GETXNEXT;VARFLAG:=72;SCANPRIMARY;
IF CURTYPE<>21 THEN{989:}BEGIN DISPERR(0,814);BEGIN HELPPTR:=4;
HELPLINE[3]:=815;HELPLINE[2]:=816;HELPLINE[1]:=817;HELPLINE[0]:=813;END;
PUTGETFLUSHE(0);END{:989}ELSE BEGIN E:=CUREXP;CURTYPE:=1;
IF NOT GETPAIR(72)THEN GOTO 45;FINDEDGESVAR(E);
IF CUREDGES<>0 THEN CULLEDGES(ROUNDUNSCALE(CURY),ROUNDUNSCALE(CURX));
GOTO 10;45:BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(837);END;BEGIN HELPPTR:=1;HELPLINE[0]:=838;END;PUTGETERROR;END;
10:END;{:1005}{1012:}PROCEDURE DOMESSAGE;VAR M:0..2;BEGIN M:=CURMOD;
GETXNEXT;SCANEXPRESSI;IF CURTYPE<>4 THEN BEGIN DISPERR(0,842);
BEGIN HELPPTR:=1;HELPLINE[0]:=843;END;PUTGETERROR;
END ELSE CASE M OF 0:PRINTNL(CUREXP);1:{1016:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(CUREXP);END;
IF ERRHELP<>0 THEN USEERRHELP:=TRUE ELSE IF LONGHELPSEEN THEN BEGIN
HELPPTR:=1;HELPLINE[0]:=844;
END ELSE BEGIN IF INTERACTION<3 THEN LONGHELPSEEN:=TRUE;
BEGIN HELPPTR:=4;HELPLINE[3]:=845;HELPLINE[2]:=846;HELPLINE[1]:=847;
HELPLINE[0]:=848;END;END;PUTGETERROR;USEERRHELP:=FALSE;END{:1016};
2:{1013:}
BEGIN IF ERRHELP<>0 THEN BEGIN IF STRREF[ERRHELP]<127 THEN IF STRREF[
ERRHELP]>1 THEN STRREF[ERRHELP]:=STRREF[ERRHELP]-1 ELSE FLUSHSTRING(
ERRHELP);END;
IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])=0 THEN ERRHELP:=0 ELSE BEGIN
ERRHELP:=CUREXP;
BEGIN IF STRREF[ERRHELP]<127 THEN STRREF[ERRHELP]:=STRREF[ERRHELP]+1;
END;END;END{:1013};END;FLUSHCUREXP(0);END;{:1012}{1033:}
FUNCTION GETCODE:EIGHTBITS;LABEL 40;VAR C:INTEGER;BEGIN GETXNEXT;
SCANEXPRESSI;IF CURTYPE=16 THEN BEGIN C:=ROUNDUNSCALE(CUREXP);
IF C>=0 THEN IF C<256 THEN GOTO 40;
END ELSE IF CURTYPE=4 THEN IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])=1
THEN BEGIN C:=STRPOOL[STRSTART[CUREXP]];GOTO 40;END;DISPERR(0,857);
BEGIN HELPPTR:=2;HELPLINE[1]:=858;HELPLINE[0]:=859;END;PUTGETFLUSHE(0);
C:=0;40:GETCODE:=C;END;{:1033}{1034:}PROCEDURE SETTAG(C:EIGHTBITS;
T:SMALLNUMBER;R:EIGHTBITS);
BEGIN IF CHARTAG[C]=0 THEN BEGIN CHARTAG[C]:=T;CHARREMAINDE[C]:=R;
END ELSE{1035:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(860);END;
IF(C>32)AND(C<128)THEN PRINT(C)ELSE BEGIN PRINT(861);PRINTINT(C);END;
PRINT(862);CASE CHARTAG[C]OF 1:PRINT(863);2:PRINT(864);3:PRINT(854);END;
BEGIN HELPPTR:=4;HELPLINE[3]:=865;HELPLINE[2]:=866;HELPLINE[1]:=867;
HELPLINE[0]:=868;END;PUTGETERROR;END{:1035};END;{:1034}{1036:}
PROCEDURE DOTFMCOMMAND;LABEL 22;VAR C,CC:EIGHTBITS;K:0..256;J:INTEGER;
BEGIN CASE CURMOD OF 0:{1037:}BEGIN C:=GETCODE;
WHILE CURCMD=78 DO BEGIN CC:=GETCODE;SETTAG(C,2,CC);C:=CC;END;END{:1037}
;1:{1038:}BEGIN 22:C:=GETCODE;IF CURCMD=77 THEN{1041:}
BEGIN IF NL>255 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(878);END;BEGIN HELPPTR:=1;HELPLINE[0]:=879;END;ERROR;
END ELSE SETTAG(C,1,NL);GOTO 22;END{:1041};
IF CURCMD=75 THEN BEGIN{1042:}LIGKERN[NL].B1:=0+C+0;
LIGKERN[NL].B2:=0+CURMOD+0;
IF CURMOD=0 THEN LIGKERN[NL].B3:=0+GETCODE+0 ELSE BEGIN GETXNEXT;
SCANEXPRESSI;IF CURTYPE<>16 THEN BEGIN DISPERR(0,880);BEGIN HELPPTR:=2;
HELPLINE[1]:=881;HELPLINE[0]:=180;END;PUTGETFLUSHE(0);END;
KERN[NK]:=CUREXP;K:=0;WHILE KERN[K]<>CUREXP DO K:=K+1;
IF K=NK THEN BEGIN IF NK=256 THEN OVERFLOW(877,256);NK:=NK+1;END;
LIGKERN[NL].B3:=0+K+0;END{:1042};
IF NL=LIGTABLESIZE THEN OVERFLOW(873,LIGTABLESIZE);NL:=NL+1;
IF CURCMD=78 THEN GOTO 22;
END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(874);END;BEGIN HELPPTR:=1;HELPLINE[0]:=875;END;BACKERROR;END;
IF NL>0 THEN LIGKERN[NL-1].B0:=128;END{:1038};2:{1043:}
BEGIN IF NE=256 THEN OVERFLOW(854,256);C:=GETCODE;SETTAG(C,3,NE);
IF CURCMD<>77 THEN BEGIN MISSINGERR(58);BEGIN HELPPTR:=1;
HELPLINE[0]:=882;END;BACKERROR;END;EXTEN[NE].B0:=0+GETCODE+0;
IF CURCMD<>78 THEN BEGIN MISSINGERR(44);BEGIN HELPPTR:=1;
HELPLINE[0]:=882;END;BACKERROR;END;EXTEN[NE].B1:=0+GETCODE+0;
IF CURCMD<>78 THEN BEGIN MISSINGERR(44);BEGIN HELPPTR:=1;
HELPLINE[0]:=882;END;BACKERROR;END;EXTEN[NE].B2:=0+GETCODE+0;
IF CURCMD<>78 THEN BEGIN MISSINGERR(44);BEGIN HELPPTR:=1;
HELPLINE[0]:=882;END;BACKERROR;END;EXTEN[NE].B3:=0+GETCODE+0;NE:=NE+1;
END{:1043};3,4:BEGIN C:=CURMOD;GETXNEXT;SCANEXPRESSI;
IF(CURTYPE<>16)OR(CUREXP<32768)THEN BEGIN DISPERR(0,869);
BEGIN HELPPTR:=2;HELPLINE[1]:=870;HELPLINE[0]:=871;END;PUTGETERROR;
END ELSE BEGIN J:=ROUNDUNSCALE(CUREXP);
IF CURCMD<>77 THEN BEGIN MISSINGERR(58);BEGIN HELPPTR:=1;
HELPLINE[0]:=872;END;BACKERROR;END;IF C=3 THEN{1044:}
REPEAT IF J>HEADERSIZE THEN OVERFLOW(855,HEADERSIZE);
HEADERBYTE[J]:=GETCODE;J:=J+1;UNTIL CURCMD<>78{:1044}ELSE{1045:}
REPEAT IF J>MAXFONTDIMEN THEN OVERFLOW(856,MAXFONTDIMEN);
WHILE J>NP DO BEGIN NP:=NP+1;PARAM[NP]:=0;END;GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>16 THEN BEGIN DISPERR(0,883);BEGIN HELPPTR:=1;
HELPLINE[0]:=180;END;PUTGETFLUSHE(0);END;PARAM[J]:=CUREXP;J:=J+1;
UNTIL CURCMD<>78{:1045};END;END;END;END;{:1036}{1100:}
PROCEDURE DOSPECIAL;VAR M:SMALLNUMBER;BEGIN M:=CURMOD;GETXNEXT;
SCANEXPRESSI;IF INTERNAL[28]>=0 THEN IF CURTYPE<>M THEN{1101:}
BEGIN DISPERR(0,898);BEGIN HELPPTR:=1;HELPLINE[0]:=899;END;PUTGETERROR;
END{:1101}ELSE BEGIN IF OUTPUTFILENA=0 THEN INITGF;IF M=4 THEN{1103:}
BEGIN IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])<=255 THEN BEGIN BEGIN
GFBUF[GFPTR]:=241;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=(STRSTART[CUREXP+1]-STRSTART[CUREXP]);
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
END ELSE BEGIN BEGIN GFBUF[GFPTR]:=243;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;
GFTHREE((STRSTART[CUREXP+1]-STRSTART[CUREXP]));END;GFSTRING(CUREXP);
END{:1103}ELSE{1102:}BEGIN BEGIN GFBUF[GFPTR]:=245;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(CUREXP);END{:1102};END;
FLUSHCUREXP(0);END;{:1100}{1111:}PROCEDURE STOREBASEFIL;
VAR J,K,L:INTEGER;P,Q:HALFWORD;X:INTEGER;W:FOURQUARTERS;BEGIN{1125:}
SELECTOR:=5;PRINT(910);PRINT(JOBNAME);PRINTCHAR(32);
PRINTINT(ROUNDUNSCALE(INTERNAL[12])MOD 100);PRINTCHAR(46);
PRINTINT(ROUNDUNSCALE(INTERNAL[13]));PRINTCHAR(46);
PRINTINT(ROUNDUNSCALE(INTERNAL[14]));PRINTCHAR(41);
IF INTERACTION=0 THEN SELECTOR:=2 ELSE SELECTOR:=3;
BEGIN IF POOLPTR+1>POOLSIZE THEN OVERFLOW(129,POOLSIZE-INITPOOLPTR);END;
BASEIDENT:=MAKESTRING;STRREF[BASEIDENT]:=127;PACKJOBNAME(911);
WHILE NOT WOPENOUT(BASEFILE)DO PROMPTFILENA(912,911);PRINTNL(913);
PRINT(WMAKENAMESTR(BASEFILE));FLUSHSTRING(STRPTR-1);
PRINTNL(BASEIDENT){:1125};{1115:}BEGIN BASEFILE↑.INT:=509781824;
PUT(BASEFILE);END;BEGIN BASEFILE↑.INT:=2500;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=2100;PUT(BASEFILE);END;BEGIN BASEFILE↑.INT:=1777;
PUT(BASEFILE);END;BEGIN BASEFILE↑.INT:=6;PUT(BASEFILE);END{:1115};
{1117:}BEGIN BASEFILE↑.INT:=POOLPTR;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=STRPTR;PUT(BASEFILE);END;
FOR K:=0 TO STRPTR DO BEGIN BASEFILE↑.INT:=STRSTART[K];PUT(BASEFILE);
END;K:=0;WHILE K+4<POOLPTR DO BEGIN W.B0:=STRPOOL[K];W.B1:=STRPOOL[K+1];
W.B2:=STRPOOL[K+2];W.B3:=STRPOOL[K+3];BEGIN BASEFILE↑.QQQQ:=W;
PUT(BASEFILE);END;K:=K+4;END;K:=POOLPTR-4;W.B0:=STRPOOL[K];
W.B1:=STRPOOL[K+1];W.B2:=STRPOOL[K+2];W.B3:=STRPOOL[K+3];
BEGIN BASEFILE↑.QQQQ:=W;PUT(BASEFILE);END;PRINTLN;PRINTINT(STRPTR);
PRINT(907);PRINTINT(POOLPTR){:1117};{1119:}SORTAVAIL;VARUSED:=0;
BEGIN BASEFILE↑.INT:=ROVER;PUT(BASEFILE);END;P:=0;Q:=ROVER;X:=0;
REPEAT FOR K:=P TO Q+1 DO BEGIN BASEFILE↑:=MEM[K];PUT(BASEFILE);END;
X:=X+Q+2-P;VARUSED:=VARUSED+Q-P;P:=Q+MEM[Q].HH.LH;Q:=MEM[Q+1].HH.RH;
UNTIL Q=ROVER;VARUSED:=VARUSED+2500-P;DYNUSED:=MEMEND-2499;
BEGIN BASEFILE↑.INT:=MEMEND;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=AVAIL;PUT(BASEFILE);END;
FOR K:=P TO MEMEND DO BEGIN BASEFILE↑:=MEM[K];PUT(BASEFILE);END;
X:=X+MEMEND+1-P;P:=AVAIL;WHILE P<>0 DO BEGIN DYNUSED:=DYNUSED-1;
P:=MEM[P].HH.RH;END;BEGIN BASEFILE↑.INT:=VARUSED;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=DYNUSED;PUT(BASEFILE);END;PRINTLN;PRINTINT(X);
PRINT(908);PRINTINT(VARUSED);PRINTCHAR(38);PRINTINT(DYNUSED){:1119};
{1121:}BEGIN BASEFILE↑.INT:=HASHUSED;PUT(BASEFILE);END;
STCOUNT:=2228-HASHUSED;
FOR P:=1 TO HASHUSED DO IF HASH[P].RH<>0 THEN BEGIN BEGIN BASEFILE↑.INT
:=P;PUT(BASEFILE);END;BEGIN BASEFILE↑.HH:=HASH[P];PUT(BASEFILE);END;
BEGIN BASEFILE↑.HH:=EQTB[P];PUT(BASEFILE);END;STCOUNT:=STCOUNT+1;END;
FOR P:=HASHUSED+1 TO 2243 DO BEGIN BEGIN BASEFILE↑.HH:=HASH[P];
PUT(BASEFILE);END;BEGIN BASEFILE↑.HH:=EQTB[P];PUT(BASEFILE);END;END;
BEGIN BASEFILE↑.INT:=STCOUNT;PUT(BASEFILE);END;PRINTLN;
PRINTINT(STCOUNT);PRINT(909){:1121};{1123:}BEGIN BASEFILE↑.INT:=INTPTR;
PUT(BASEFILE);END;
FOR K:=1 TO INTPTR DO BEGIN BEGIN BASEFILE↑.INT:=INTERNAL[K];
PUT(BASEFILE);END;BEGIN BASEFILE↑.INT:=INTNAME[K];PUT(BASEFILE);END;END;
BEGIN BASEFILE↑.INT:=STARTSYM;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=INTERACTION;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=BASEIDENT;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=69069;PUT(BASEFILE);END;INTERNAL[10]:=0{:1123};
{1126:}WCLOSE(BASEFILE){:1126};END;{:1111}PROCEDURE DOSTATEMENT;
BEGIN CURTYPE:=1;GETXNEXT;IF CURCMD>42 THEN{925:}
BEGIN IF CURCMD<79 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(719);END;PRINTCMDMOD(CURCMD,CURMOD);PRINTCHAR(39);
BEGIN HELPPTR:=5;HELPLINE[4]:=720;HELPLINE[3]:=721;HELPLINE[2]:=722;
HELPLINE[1]:=723;HELPLINE[0]:=724;END;BACKERROR;GETNEXT;END;END{:925}
ELSE IF CURCMD>29 THEN{928:}BEGIN VARFLAG:=76;SCANEXPRESSI;
IF CURCMD<80 THEN BEGIN IF CURCMD=50 THEN DOEQUATION ELSE IF CURCMD=76
THEN DOASSIGNMENT ELSE IF CURTYPE=4 THEN{929:}
BEGIN IF INTERNAL[1]>0 THEN BEGIN PRINTNL(CUREXP);BREAK(TTY);END;
IF INTERNAL[28]>0 THEN{1104:}BEGIN IF OUTPUTFILENA=0 THEN INITGF;
IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])<=249 THEN BEGIN BEGIN GFBUF[
GFPTR]:=241;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=(STRSTART[CUREXP+1]-STRSTART[CUREXP])+6;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
END ELSE BEGIN BEGIN GFBUF[GFPTR]:=243;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;
GFTHREE((STRSTART[CUREXP+1]-STRSTART[CUREXP])+6);END;GFSTRING(900);
GFSTRING(CUREXP);END{:1104};END{:929}
ELSE IF CURTYPE<>1 THEN BEGIN DISPERR(0,729);BEGIN HELPPTR:=3;
HELPLINE[2]:=730;HELPLINE[1]:=731;HELPLINE[0]:=732;END;PUTGETERROR;END;
FLUSHCUREXP(0);CURTYPE:=1;END;END{:928}ELSE{927:}
BEGIN IF INTERNAL[6]>0 THEN SHOWCMDMOD(CURCMD,CURMOD);
CASE CURCMD OF 29:DOTYPEDECLAR;
14:IF CURMOD>2 THEN MAKEOPDEF ELSE IF CURMOD>0 THEN SCANDEF;15:READTOKS;
{954:}23:DORANDOMSEED;{:954}{956:}22:BEGIN PRINTLN;INTERACTION:=CURMOD;
{69:}IF INTERACTION=0 THEN SELECTOR:=0 ELSE SELECTOR:=1{:69};
IF JOBNAME<>0 THEN SELECTOR:=SELECTOR+2;GETNEXT;END;{:956}{959:}
20:DOPROTECTION;{:959}{963:}26:DEFDELIMS;{:963}{966:}
10:REPEAT GETSYMBOL;SAVEVARIABLE(CURSYM);GETNEXT;UNTIL CURCMD<>78;
11:DOINTERIM;12:DOLET;13:DONEWINTERNA;{:966}{972:}
21:BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
CASE CURMOD OF 0:DOSHOWTOKEN;1:DOSHOWSTATS;2,3:DOSHOW;4:DOSHOWVAR;
5,6:DOSHOWDEPEND(CURMOD);END;BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(787);END;IF INTERACTION<3 THEN BEGIN HELPPTR:=0;
ERRORCOUNT:=ERRORCOUNT-1;END ELSE BEGIN HELPPTR:=1;HELPLINE[0]:=788;END;
IF CURCMD=79 THEN ERROR ELSE PUTGETERROR;END;{:972}{987:}17:DOADDTO;
{:987}{1000:}16:DOSHIPOUT;9:DODISPLAY;27:DOOPENWINDOW;18:DOCULL;{:1000}
{1006:}25:BEGIN GETSYMBOL;STARTSYM:=CURSYM;GETNEXT;END;{:1006}{1011:}
24:DOMESSAGE;{:1011}{1030:}19:DOTFMCOMMAND;{:1030}{1098:}28:DOSPECIAL;
{:1098}END;CURTYPE:=1;END{:927};IF CURCMD<79 THEN{926:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(725);
END;BEGIN HELPPTR:=6;HELPLINE[5]:=726;HELPLINE[4]:=727;HELPLINE[3]:=728;
HELPLINE[2]:=722;HELPLINE[1]:=723;HELPLINE[0]:=724;END;BACKERROR;
SCANNERSTATU:=2;REPEAT GETNEXT;{690:}
IF CURCMD=40 THEN BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1
THEN STRREF[CURMOD]:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END{:690}
;UNTIL CURCMD>=79;SCANNERSTATU:=0;END{:926};ERRORCOUNT:=0;END;{:924}
{951:}PROCEDURE MAINCONTROL;BEGIN REPEAT DOSTATEMENT;
IF CURCMD=80 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(757);END;BEGIN HELPPTR:=2;HELPLINE[1]:=758;
HELPLINE[0]:=536;END;FLUSHERROR(0);END;UNTIL CURCMD=81;END;{:951}{1047:}
FUNCTION SORTIN(V:SCALED):HALFWORD;LABEL 40;VAR P,Q,R:HALFWORD;
BEGIN P:=2501;WHILE TRUE DO BEGIN Q:=MEM[P].HH.RH;
IF V<=MEM[Q+1].INT THEN GOTO 40;P:=Q;END;
40:IF V<MEM[Q+1].INT THEN BEGIN R:=GETNODE(2);MEM[R+1].INT:=V;
MEM[R].HH.RH:=Q;MEM[P].HH.RH:=R;END;SORTIN:=MEM[P].HH.RH;END;{:1047}
{1048:}FUNCTION MINCOVER(D:SCALED):INTEGER;VAR P:HALFWORD;L:SCALED;
M:INTEGER;BEGIN M:=0;P:=MEM[2501].HH.RH;PERTURBATION:=2147483647;
WHILE P<>24 DO BEGIN M:=M+1;L:=MEM[P+1].INT;REPEAT P:=MEM[P].HH.RH;
UNTIL MEM[P+1].INT>L+D;
IF MEM[P+1].INT-L<PERTURBATION THEN PERTURBATION:=MEM[P+1].INT-L;END;
MINCOVER:=M;END;{:1048}{1050:}FUNCTION THRESHOLD(M:INTEGER):SCALED;
VAR D:SCALED;
BEGIN IF MINCOVER(0)<=M THEN THRESHOLD:=0 ELSE BEGIN REPEAT D:=
PERTURBATION;UNTIL MINCOVER(D+D)<=M;
WHILE MINCOVER(D)>M DO D:=PERTURBATION;THRESHOLD:=D;END;END;{:1050}
{1051:}FUNCTION SKIMP(M:INTEGER):INTEGER;VAR D:SCALED;P,Q,R:HALFWORD;
L:SCALED;V:SCALED;BEGIN D:=THRESHOLD(M);PERTURBATION:=0;Q:=2501;M:=0;
P:=MEM[2501].HH.RH;WHILE P<>24 DO BEGIN M:=M+1;L:=MEM[P+1].INT;
MEM[P].HH.LH:=M;IF MEM[MEM[P].HH.RH+1].INT<=L+D THEN{1052:}
BEGIN REPEAT P:=MEM[P].HH.RH;MEM[P].HH.LH:=M;
UNTIL MEM[MEM[P].HH.RH+1].INT>L+D;V:=(L+MEM[P+1].INT)DIV 2;
IF MEM[P+1].INT-V>PERTURBATION THEN PERTURBATION:=MEM[P+1].INT-V;R:=Q;
REPEAT R:=MEM[R].HH.RH;MEM[R+1].INT:=V;UNTIL R=P;MEM[Q].HH.RH:=P;
END{:1052};Q:=P;P:=MEM[P].HH.RH;END;SKIMP:=M;END;{:1051}{1053:}
PROCEDURE TFMWARNING(M:SMALLNUMBER);BEGIN PRINTNL(884);
PRINT(INTNAME[M]);PRINT(885);PRINTSCALED(PERTURBATION);PRINT(886);END;
{:1053}{1058:}PROCEDURE FIXCHECKSUM;VAR K:EIGHTBITS;
B1,B2,B3,B4:EIGHTBITS;X:INTEGER;
BEGIN IF HEADERBYTE[1]<0 THEN IF HEADERBYTE[2]<0 THEN IF HEADERBYTE[3]<0
THEN IF HEADERBYTE[4]<0 THEN BEGIN{1060:}B1:=0;B2:=0;B3:=BC;B4:=EC;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN BEGIN X:=((MEM[TFMWIDTH[K]+1].
INT+8)DIV 16)+K*4194304;IF X<0 THEN X:=X+1073741823;
B1:=(B1+B1+X)MOD 256;B2:=(B2+B2+(X MOD 255))MOD 256;
B3:=(B3+B3+(X MOD 253))MOD 256;B4:=(B4+B4+(X MOD 251))MOD 256;END;
{:1060};HEADERBYTE[1]:=B1;HEADERBYTE[2]:=B2;HEADERBYTE[3]:=B3;
HEADERBYTE[4]:=B4;END;END;{:1058}{1059:}PROCEDURE FIXDESIGNSIZ;
VAR D:SCALED;BEGIN D:=INTERNAL[23];
IF(D<65536)OR(D>=134217728)THEN BEGIN IF D<>0 THEN PRINTNL(887);
D:=8388608;INTERNAL[23]:=D;END;
IF HEADERBYTE[5]<0 THEN IF HEADERBYTE[6]<0 THEN IF HEADERBYTE[7]<0 THEN
IF HEADERBYTE[8]<0 THEN BEGIN HEADERBYTE[5]:=D DIV 1048576;
HEADERBYTE[6]:=(D DIV 4096)MOD 256;HEADERBYTE[7]:=(D DIV 16)MOD 256;
HEADERBYTE[8]:=(D MOD 16)*16;END;MAXTFMDIMEN:=16*INTERNAL[23];
IF MAXTFMDIMEN>=134217728 THEN MAXTFMDIMEN:=134217727;END;{:1059}{1061:}
PROCEDURE TFMTWO(X:INTEGER);BEGIN WRITE(TFMFILE,X DIV 256);
WRITE(TFMFILE,X MOD 256);END;PROCEDURE TFMFOUR(X:INTEGER);
BEGIN IF X>=0 THEN WRITE(TFMFILE,X DIV 16777216)ELSE BEGIN X:=X
+1073741824;X:=X+1073741824;WRITE(TFMFILE,(X DIV 16777216)+128);END;
X:=X MOD 16777216;WRITE(TFMFILE,X DIV 65536);X:=X MOD 65536;
WRITE(TFMFILE,X DIV 256);WRITE(TFMFILE,X MOD 256);END;
PROCEDURE TFMQQQQ(X:FOURQUARTERS);BEGIN WRITE(TFMFILE,0+X.B0-0);
WRITE(TFMFILE,0+X.B1-0);WRITE(TFMFILE,0+X.B2-0);WRITE(TFMFILE,0+X.B3-0);
END;{:1061}{1065:}PROCEDURE TFMDIMENOUT(X:SCALED);
BEGIN IF ABS(X)>=MAXTFMDIMEN THEN BEGIN TFMCHANGED:=TFMCHANGED+1;
IF X>0 THEN X:=16777215 ELSE X:=-16777215;
END ELSE X:=MAKESCALED(X*16,INTERNAL[23]);TFMFOUR(X);END;{:1065}{1112:}
{725:}FUNCTION OPENBASEFILE:BOOLEAN;LABEL 40,10;VAR J:0..BUFSIZE;
BEGIN IF BUFFER[CURINPUT.LOCFIELD]=38 THEN BEGIN CURINPUT.LOCFIELD:=
CURINPUT.LOCFIELD+1;J:=CURINPUT.LOCFIELD;BUFFER[LAST]:=32;
WHILE BUFFER[J]<>32 DO J:=J+1;PACKBUFFERED(0,CURINPUT.LOCFIELD,J-1);
IF WOPENIN(BASEFILE)THEN BEGIN CURINPUT.LOCFIELD:=J;GOTO 40;END;
PACKBUFFERED(9,CURINPUT.LOCFIELD,J-1);
IF WOPENIN(BASEFILE)THEN BEGIN CURINPUT.LOCFIELD:=J;GOTO 40;END;
WAKEUPTERMIN;
WRITELN(TTY,'Sorry, I can''t find that base;',' will try PLAIN.');END;
PACKBUFFERED(14,1,0);IF NOT WOPENIN(BASEFILE)THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'I can''t find the PLAIN base file!');OPENBASEFILE:=FALSE;
GOTO 10;END;40:OPENBASEFILE:=TRUE;10:END;{:725}
FUNCTION LOADBASEFILE:BOOLEAN;LABEL 6666,10;VAR J,K:INTEGER;
P,Q:HALFWORD;X:INTEGER;W:FOURQUARTERS;BEGIN{1116:}X:=BASEFILE↑.INT;
IF X<>509781824 THEN GOTO 6666;BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<>2500 THEN GOTO 6666;BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<>2100 THEN GOTO 6666;BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<>1777 THEN GOTO 6666;BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<>6 THEN GOTO 6666{:1116};{1118:}BEGIN BEGIN GET(BASEFILE);
X:=BASEFILE↑.INT;END;IF X<0 THEN GOTO 6666;
IF X>POOLSIZE THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'---! Must increase the ','string pool size');GOTO 6666;
END ELSE POOLPTR:=X;END;BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<0 THEN GOTO 6666;IF X>MAXSTRINGS THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'---! Must increase the ','max strings');GOTO 6666;
END ELSE STRPTR:=X;END;
FOR K:=0 TO STRPTR DO BEGIN BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;
END;IF(X<0)OR(X>POOLPTR)THEN GOTO 6666 ELSE STRSTART[K]:=X;END;
STRREF[K]:=127;END;K:=0;WHILE K+4<POOLPTR DO BEGIN BEGIN GET(BASEFILE);
W:=BASEFILE↑.QQQQ;END;STRPOOL[K]:=W.B0;STRPOOL[K+1]:=W.B1;
STRPOOL[K+2]:=W.B2;STRPOOL[K+3]:=W.B3;K:=K+4;END;K:=POOLPTR-4;
BEGIN GET(BASEFILE);W:=BASEFILE↑.QQQQ;END;STRPOOL[K]:=W.B0;
STRPOOL[K+1]:=W.B1;STRPOOL[K+2]:=W.B2;STRPOOL[K+3]:=W.B3{:1118};{1120:}
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>2500)THEN GOTO 6666 ELSE ROVER:=X;END;P:=0;Q:=ROVER;X:=0;
REPEAT FOR K:=P TO Q+1 DO BEGIN GET(BASEFILE);MEM[K]:=BASEFILE↑;END;
P:=Q+MEM[Q].HH.LH;
IF(P>2500)OR((Q>=MEM[Q+1].HH.RH)AND(MEM[Q+1].HH.RH<>ROVER))THEN GOTO
6666;Q:=MEM[Q+1].HH.RH;UNTIL Q=ROVER;BEGIN BEGIN GET(BASEFILE);
X:=BASEFILE↑.INT;END;IF X<2500 THEN GOTO 6666;
IF X>MEMMAX THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'---! Must increase the ','mem max');GOTO 6666;
END ELSE MEMEND:=X;END;BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>MEMEND)THEN GOTO 6666 ELSE AVAIL:=X;END;
FOR K:=P TO MEMEND DO BEGIN GET(BASEFILE);MEM[K]:=BASEFILE↑;END;
BEGIN GET(BASEFILE);VARUSED:=BASEFILE↑.INT;END;BEGIN GET(BASEFILE);
DYNUSED:=BASEFILE↑.INT;END;MAXVARUSED:=VARUSED{:1120};{1122:}
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<1)OR(X>2229)THEN GOTO 6666 ELSE HASHUSED:=X;END;P:=0;
REPEAT BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<P+1)OR(X>HASHUSED)THEN GOTO 6666 ELSE P:=X;END;BEGIN GET(BASEFILE);
HASH[P]:=BASEFILE↑.HH;END;BEGIN GET(BASEFILE);EQTB[P]:=BASEFILE↑.HH;END;
UNTIL P=HASHUSED;FOR P:=HASHUSED+1 TO 2243 DO BEGIN BEGIN GET(BASEFILE);
HASH[P]:=BASEFILE↑.HH;END;BEGIN GET(BASEFILE);EQTB[P]:=BASEFILE↑.HH;END;
END;BEGIN GET(BASEFILE);STCOUNT:=BASEFILE↑.INT;END{:1122};{1124:}
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<31)OR(X>MAXINTERNAL)THEN GOTO 6666 ELSE INTPTR:=X;END;
FOR K:=1 TO INTPTR DO BEGIN BEGIN GET(BASEFILE);
INTERNAL[K]:=BASEFILE↑.INT;END;BEGIN BEGIN GET(BASEFILE);
X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>STRPTR)THEN GOTO 6666 ELSE INTNAME[K]:=X;END;END;
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>2229)THEN GOTO 6666 ELSE STARTSYM:=X;END;
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>3)THEN GOTO 6666 ELSE INTERACTION:=X;END;
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>STRPTR)THEN GOTO 6666 ELSE BASEIDENT:=X;END;
BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<>69069)OR EOF(BASEFILE)THEN GOTO 6666{:1124};LOADBASEFILE:=TRUE;
GOTO 10;6666:WAKEUPTERMIN;
WRITELN(TTY,'(Fatal base file error; I''m stymied)');
LOADBASEFILE:=FALSE;10:END;{:1112}{1127:}{763:}PROCEDURE SCANPRIMARY;
LABEL 20,30,31,10;VAR P,Q:HALFWORD;C:QUARTERWORD;MYVARFLAG:0..81;
LDELIM,RDELIM:HALFWORD;{769:}GROUPLINE:INTEGER;{:769}{774:}
NUM,DENOM:SCALED;{:774}{781:}PREHEAD,POSTHEAD,TAIL:HALFWORD;
TT:SMALLNUMBER;T:HALFWORD;MACROREF:HALFWORD;{:781}
BEGIN MYVARFLAG:=VARFLAG;VARFLAG:=0;20:IF ARITHERROR THEN CLEARARITH;
{765:}IF PANICKING THEN CHECKMEM(FALSE);
IF INTERRUPT<>0 THEN IF OKTOINTERRUP THEN BEGIN BACKINPUT;
BEGIN IF INTERRUPT<>0 THEN PAUSEFORINST;END;GETXNEXT;END{:765};
CASE CURCMD OF 30:{766:}BEGIN LDELIM:=CURSYM;RDELIM:=CURMOD;GETXNEXT;
SCANEXPRESSI;IF(CURCMD=78)AND(CURTYPE>=16)THEN{768:}BEGIN P:=GETNODE(2);
MEM[P].HH.B0:=15;MEM[P].HH.B1:=11;INITBIGNODE(P);Q:=MEM[P+1].INT;
STASHIN(Q);GETXNEXT;SCANEXPRESSI;
IF CURTYPE<16 THEN BEGIN DISPERR(0,623);BEGIN HELPPTR:=4;
HELPLINE[3]:=624;HELPLINE[2]:=625;HELPLINE[1]:=626;HELPLINE[0]:=627;END;
PUTGETFLUSHE(0);END;STASHIN(Q+2);CHECKDELIMIT(LDELIM,RDELIM);
CURTYPE:=15;CUREXP:=P;END{:768}ELSE CHECKDELIMIT(LDELIM,RDELIM);
END{:766};31:{770:}BEGIN GROUPLINE:=LINE;
IF INTERNAL[6]>0 THEN SHOWCMDMOD(CURCMD,CURMOD);BEGIN P:=GETAVAIL;
MEM[P].HH.LH:=0;MEM[P].HH.RH:=SAVEPTR;SAVEPTR:=P;END;REPEAT DOSTATEMENT;
UNTIL CURCMD<>79;
IF CURCMD<>80 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(628);END;PRINTINT(GROUPLINE);PRINT(629);
BEGIN HELPPTR:=2;HELPLINE[1]:=630;HELPLINE[0]:=631;END;BACKERROR;
CURCMD:=80;END;UNSAVE;IF INTERNAL[6]>0 THEN SHOWCMDMOD(CURCMD,CURMOD);
END{:770};40:{771:}BEGIN CURTYPE:=4;CUREXP:=CURMOD;END{:771};41:{775:}
BEGIN CUREXP:=CURMOD;CURTYPE:=16;GETXNEXT;
IF CURCMD<>54 THEN DENOM:=0 ELSE BEGIN GETXNEXT;
IF CURCMD<>41 THEN BEGIN BACKINPUT;CURCMD:=54;CURMOD:=68;CURSYM:=2233;
GOTO 10;END;NUM:=CUREXP;DENOM:=CURMOD;IF DENOM=0 THEN{776:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(632);
END;BEGIN HELPPTR:=1;HELPLINE[0]:=633;END;ERROR;END{:776}
ELSE CUREXP:=MAKESCALED(NUM,DENOM);GETXNEXT;END;
IF CURCMD>=29 THEN IF CURCMD<41 THEN BEGIN P:=STASHCUREXP;SCANPRIMARY;
IF(ABS(NUM)>=ABS(DENOM))OR(CURTYPE<15)THEN DOBINARY(P,67)ELSE BEGIN
FRACMULT(MAKEFRACTION(NUM,DENOM));FREENODE(P,2);END;END;GOTO 10;
END{:775};32:{772:}DONULLARY(CURMOD){:772};33,29,35,42:{773:}
BEGIN C:=CURMOD;GETXNEXT;SCANPRIMARY;DOUNARY(C);GOTO 10;END{:773};
36:{777:}BEGIN C:=CURMOD;GETXNEXT;SCANEXPRESSI;
IF CURCMD<>67 THEN BEGIN MISSINGERR(337);PRINT(634);PRINTCMDMOD(36,C);
BEGIN HELPPTR:=1;HELPLINE[0]:=565;END;BACKERROR;END;P:=STASHCUREXP;
GETXNEXT;SCANPRIMARY;DOBINARY(P,C);GOTO 10;END{:777};34:{778:}
BEGIN GETXNEXT;SCANSUFFIX;OLDSETTING:=SELECTOR;SELECTOR:=5;
SHOWTOKENLIS(CUREXP,0,10000);FLUSHTOKENLI(CUREXP);CUREXP:=MAKESTRING;
SELECTOR:=OLDSETTING;CURTYPE:=4;GOTO 10;END{:778};37:{779:}
BEGIN Q:=CURMOD;IF MYVARFLAG=76 THEN BEGIN GETXNEXT;
IF CURCMD=76 THEN BEGIN CUREXP:=GETAVAIL;MEM[CUREXP].HH.LH:=Q+2243;
CURTYPE:=21;GOTO 10;END;BACKINPUT;END;CURTYPE:=16;CUREXP:=INTERNAL[Q];
END{:779};38:MAKEEXPCOPY(CURMOD);39:{782:}BEGIN PREHEAD:=GETAVAIL;
TAIL:=PREHEAD;POSTHEAD:=0;TT:=1;WHILE TRUE DO BEGIN T:=CURTOK;
MEM[TAIL].HH.RH:=T;IF TT<>0 THEN BEGIN{789:}BEGIN P:=MEM[PREHEAD].HH.RH;
Q:=MEM[P].HH.LH;TT:=0;IF EQTB[Q].LH MOD 82=39 THEN BEGIN Q:=EQTB[Q].RH;
WHILE TRUE DO BEGIN P:=MEM[P].HH.RH;IF P=0 THEN BEGIN TT:=MEM[Q].HH.B0;
GOTO 31;END;IF MEM[Q].HH.B0<>22 THEN GOTO 31;
Q:=MEM[MEM[Q+1].HH.LH].HH.RH;
IF P>2500 THEN BEGIN REPEAT Q:=MEM[Q].HH.RH;
UNTIL MEM[Q+2].HH.LH>=MEM[P].HH.LH;
IF MEM[Q+2].HH.LH>MEM[P].HH.LH THEN GOTO 31;END;END;END;31:END{:789};
IF TT>=23 THEN{783:}BEGIN MEM[TAIL].HH.RH:=0;
IF TT>23 THEN BEGIN POSTHEAD:=GETAVAIL;TAIL:=POSTHEAD;
MEM[TAIL].HH.RH:=T;TT:=0;MACROREF:=MEM[Q+1].INT;
MEM[MACROREF].HH.LH:=MEM[MACROREF].HH.LH+1;END ELSE{792:}
BEGIN P:=GETAVAIL;MEM[PREHEAD].HH.LH:=MEM[PREHEAD].HH.RH;
MEM[PREHEAD].HH.RH:=P;MEM[P].HH.LH:=T;MACROCALL(MEM[Q+1].INT,PREHEAD,0);
GETXNEXT;GOTO 20;END{:792};END{:783};END;GETXNEXT;TAIL:=T;
IF CURCMD=52 THEN{784:}BEGIN GETXNEXT;SCANEXPRESSI;
IF CURCMD<>63 THEN{785:}BEGIN BACKINPUT;BACKEXPR;CURCMD:=52;
CURSYM:=2232;END{:785}ELSE BEGIN IF CURTYPE<>16 THEN BADSUBSCRIPT;
CURCMD:=41;CURMOD:=CUREXP;CURSYM:=0;END;END{:784};
IF CURCMD<>41 THEN IF CURCMD<>39 THEN GOTO 30;END;30:{791:}
IF POSTHEAD<>0 THEN{793:}BEGIN BACKINPUT;P:=GETAVAIL;
Q:=MEM[POSTHEAD].HH.RH;MEM[PREHEAD].HH.LH:=MEM[PREHEAD].HH.RH;
MEM[PREHEAD].HH.RH:=POSTHEAD;MEM[POSTHEAD].HH.LH:=Q;
MEM[POSTHEAD].HH.RH:=P;MEM[P].HH.LH:=MEM[Q].HH.RH;MEM[Q].HH.RH:=0;
MACROCALL(MACROREF,PREHEAD,0);
MEM[MACROREF].HH.LH:=MEM[MACROREF].HH.LH-1;GETXNEXT;GOTO 20;END{:793};
Q:=MEM[PREHEAD].HH.RH;BEGIN MEM[PREHEAD].HH.RH:=AVAIL;AVAIL:=PREHEAD;
DYNUSED:=DYNUSED-1;END;IF CURCMD=MYVARFLAG THEN BEGIN CURTYPE:=21;
CUREXP:=Q;GOTO 10;END;P:=FINDVARIABLE(Q);
IF P=0 THEN BEGIN OBLITERATED(Q);HELPLINE[2]:=645;HELPLINE[1]:=646;
HELPLINE[0]:=647;FLUSHNODELIS(Q);BACKINPUT;CURCMD:=41;CURMOD:=0;
CURSYM:=0;INSERROR;GOTO 20;END;FLUSHNODELIS(Q);MAKEEXPCOPY(P);
GOTO 10{:791};END{:782};OTHERS:BEGIN BADEXP(617);GOTO 20;END END;
GETXNEXT;10:END;{:763}{800:}PROCEDURE SCANSUFFIX;LABEL 30;
VAR H,T:HALFWORD;P:HALFWORD;BEGIN H:=GETAVAIL;T:=H;
WHILE TRUE DO BEGIN IF CURCMD=52 THEN{801:}BEGIN GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>16 THEN BADSUBSCRIPT;
IF CURCMD<>63 THEN BEGIN MISSINGERR(93);BEGIN HELPPTR:=3;
HELPLINE[2]:=649;HELPLINE[1]:=650;HELPLINE[0]:=544;END;BACKERROR;END;
CURCMD:=41;CURMOD:=CUREXP;END{:801};
IF CURCMD=41 THEN P:=NEWNUMTOK(CURMOD)ELSE IF CURCMD=39 THEN BEGIN P:=
GETAVAIL;MEM[P].HH.LH:=CURSYM;END ELSE GOTO 30;MEM[T].HH.RH:=P;T:=P;
GETXNEXT;END;30:CUREXP:=MEM[H].HH.RH;BEGIN MEM[H].HH.RH:=AVAIL;AVAIL:=H;
DYNUSED:=DYNUSED-1;END;CURTYPE:=21;END;{:800}{802:}
PROCEDURE SCANSECONDAR;LABEL 20,22,10;VAR P,Q,R:HALFWORD;C,D:HALFWORD;
MACNAME:HALFWORD;BEGIN 20:IF(CURCMD<29)OR(CURCMD>42)THEN BADEXP(651);
SCANPRIMARY;
22:IF CURCMD>=51 THEN IF CURCMD<=55 THEN BEGIN P:=STASHCUREXP;C:=CURMOD;
D:=CURCMD;IF D=53 THEN BEGIN MACNAME:=CURSYM;
MEM[C].HH.LH:=MEM[C].HH.LH+1;END;GETXNEXT;IF D=52 THEN{804:}
BEGIN SCANEXPRESSI;IF CURCMD<>78 THEN BEGIN{785:}BEGIN BACKINPUT;
BACKEXPR;CURCMD:=52;CURSYM:=2232;END{:785};GOTO 10;END;Q:=STASHCUREXP;
GETXNEXT;SCANEXPRESSI;IF CURCMD<>63 THEN BEGIN MISSINGERR(93);
BEGIN HELPPTR:=3;HELPLINE[2]:=652;HELPLINE[1]:=650;HELPLINE[0]:=544;END;
BACKERROR;END;R:=STASHCUREXP;MAKEEXPCOPY(Q);DOBINARY(R,66);
DOBINARY(P,67);DOBINARY(Q,65);GETXNEXT;END{:804}ELSE BEGIN SCANPRIMARY;
IF D<>53 THEN DOBINARY(P,C)ELSE BEGIN BACKINPUT;BINARYMAC(P,C,MACNAME);
MEM[C].HH.LH:=MEM[C].HH.LH-1;GETXNEXT;GOTO 20;END;END;GOTO 22;END;
10:END;{:802}{805:}PROCEDURE SCANTERTIARY;LABEL 20,22;
VAR P,Q,R:HALFWORD;C,D:HALFWORD;MACNAME:HALFWORD;
BEGIN 20:IF(CURCMD<29)OR(CURCMD>42)THEN BADEXP(653);SCANSECONDAR;
IF CURTYPE=8 THEN MATERIALIZEP;
22:IF CURCMD>=42 THEN IF CURCMD<=46 THEN IF(CURCMD<>46)OR(CURTYPE<11)
THEN BEGIN P:=STASHCUREXP;C:=CURMOD;D:=CURCMD;
IF D=43 THEN BEGIN MACNAME:=CURSYM;MEM[C].HH.LH:=MEM[C].HH.LH+1;END;
GETXNEXT;IF D=45 THEN{809:}BEGIN{810:}BEGIN UNSTASHCUREX(P);
Q:=NEWFRAGMENT;END{:810};IF CURCMD=60 THEN{814:}BEGIN GETXNEXT;
SCANEXPRESSI;IF(CURTYPE<>16)OR(CUREXP<0)THEN BEGIN DISPERR(0,666);
BEGIN HELPPTR:=1;HELPLINE[0]:=667;END;PUTGETFLUSHE(65536);END;
MEM[Q].HH.B1:=3;MEM[Q+5].INT:=CUREXP;END{:814}ELSE{815:}
BEGIN MEM[Q].HH.B1:=2;SCANEXPRESSI;IF CURTYPE>15 THEN{816:}
BEGIN IF CURTYPE<>16 THEN BEGIN DISPERR(0,662);BEGIN HELPPTR:=3;
HELPLINE[2]:=663;HELPLINE[1]:=660;HELPLINE[0]:=661;END;PUTGETFLUSHE(0);
END;MEM[Q+5].INT:=CUREXP;IF CURCMD<>78 THEN BEGIN MISSINGERR(44);
BEGIN HELPPTR:=2;HELPLINE[1]:=668;HELPLINE[0]:=669;END;BACKERROR;END;
GETXNEXT;SCANEXPRESSI;IF CURTYPE<>16 THEN BEGIN DISPERR(0,664);
BEGIN HELPPTR:=3;HELPLINE[2]:=665;HELPLINE[1]:=660;HELPLINE[0]:=661;END;
PUTGETFLUSHE(0);END;MEM[Q+6].INT:=CUREXP;END{:816}
ELSE BEGIN P:=KNOWNPAIR;IF P=0 THEN BEGIN MEM[Q+5].INT:=0;
MEM[Q+6].INT:=0;END ELSE BEGIN MEM[Q+5].INT:=MEM[P+1].INT;
MEM[Q+6].INT:=MEM[P+3].INT;FREENODE(P,4);END;END;END{:815};
IF CURCMD<>64 THEN BEGIN MISSINGERR(125);BEGIN HELPPTR:=3;
HELPLINE[2]:=656;HELPLINE[1]:=657;HELPLINE[0]:=544;END;BACKERROR;END;
CURTYPE:=13;CUREXP:=Q;GETXNEXT;END{:809}ELSE BEGIN SCANSECONDAR;
IF D<>43 THEN DOBINARY(P,C)ELSE BEGIN BACKINPUT;BINARYMAC(P,C,MACNAME);
MEM[C].HH.LH:=MEM[C].HH.LH-1;GETXNEXT;GOTO 20;END;END;GOTO 22;END;END;
{:805}{817:}PROCEDURE SCANEXPRESSI;LABEL 20,30,31,22,25,10;
VAR P,Q,R,PP,QQ:HALFWORD;C,D:HALFWORD;MYVARFLAG:0..81;MACNAME:HALFWORD;
CYCLEHIT:BOOLEAN;ABORTPATH:BOOLEAN;GIVENLIST:HALFWORD;X,Y,T:SCALED;
BEGIN MYVARFLAG:=VARFLAG;20:IF(CURCMD<29)OR(CURCMD>42)THEN BADEXP(670);
SCANTERTIARY;
22:IF CURCMD>=46 THEN IF CURCMD<=50 THEN IF(CURCMD<>50)OR(MYVARFLAG<>76)
THEN BEGIN P:=STASHCUREXP;C:=CURMOD;D:=CURCMD;
IF D=48 THEN BEGIN MACNAME:=CURSYM;MEM[C].HH.LH:=MEM[C].HH.LH+1;END;
IF D<=47 THEN{818:}BEGIN{820:}BEGIN ABORTPATH:=FALSE;GIVENLIST:=0;
IF MEM[P].HH.B0=15 THEN BEGIN UNSTASHCUREX(P);P:=NEWFRAGMENT;
END ELSE IF(MEM[P].HH.B0=11)OR(MEM[P].HH.B0=13)THEN BEGIN Q:=P;
P:=MEM[P+1].INT;FREENODE(Q,2);END ELSE BEGIN ABORTPATH:=TRUE;Q:=16;
GOTO 30;END;Q:=P;IF MEM[P].HH.B0=5 THEN BEGIN R:=FIXFRAGMENT(P);
IF R<>0 THEN BEGIN MEM[R].HH.RH:=GIVENLIST;GIVENLIST:=R;END;
END ELSE BEGIN WHILE MEM[Q].HH.RH<>P DO Q:=MEM[Q].HH.RH;
IF MEM[P].HH.B0<>0 THEN BEGIN R:=COPYKNOT(P);MEM[Q].HH.RH:=R;Q:=R;
MEM[P].HH.B0:=0;MEM[Q].HH.B1:=0;END;END;30:END{:820};25:D:=CURCMD;
IF D=47 THEN{822:}BEGIN GETXNEXT;IF CURCMD=59 THEN{825:}
IF CURMOD=0 THEN BEGIN MEM[Q+6].INT:=0;T:=0;GETXNEXT;
END ELSE BEGIN GETXNEXT;SCANPRIMARY;{826:}
IF(CURTYPE<>16)OR(CUREXP<49152)THEN BEGIN DISPERR(0,674);
BEGIN HELPPTR:=1;HELPLINE[0]:=675;END;PUTGETFLUSHE(65536);END{:826};
MEM[Q+6].INT:=CUREXP;IF CURCMD=51 THEN BEGIN GETXNEXT;SCANPRIMARY;{826:}
IF(CURTYPE<>16)OR(CUREXP<49152)THEN BEGIN DISPERR(0,674);
BEGIN HELPPTR:=1;HELPLINE[0]:=675;END;PUTGETFLUSHE(65536);END{:826};END;
T:=CUREXP;END{:825}ELSE IF CURCMD=58 THEN{827:}BEGIN MEM[Q].HH.B1:=1;
GETXNEXT;SCANPRIMARY;PP:=KNOWNPAIR;IF PP=0 THEN BEGIN MEM[Q+5].INT:=0;
MEM[Q+6].INT:=0;END ELSE BEGIN MEM[Q+5].INT:=MEM[PP+1].INT;
MEM[Q+6].INT:=MEM[PP+3].INT;FREENODE(PP,4);END;
IF CURCMD<>51 THEN BEGIN X:=MEM[Q+5].INT;Y:=MEM[Q+6].INT;
END ELSE BEGIN GETXNEXT;SCANPRIMARY;PP:=KNOWNPAIR;
IF PP=0 THEN BEGIN X:=0;Y:=0;END ELSE BEGIN X:=MEM[PP+1].INT;
Y:=MEM[PP+3].INT;FREENODE(PP,4);END;END;END{:827}
ELSE BEGIN MEM[Q+6].INT:=65536;T:=65536;BACKINPUT;GOTO 31;END;
IF CURCMD<>47 THEN BEGIN MISSINGERR(279);BEGIN HELPPTR:=1;
HELPLINE[0]:=671;END;BACKERROR;END;31:END{:822};GETXNEXT;
IF(CURCMD=35)AND NOT ABORTPATH THEN{829:}BEGIN CYCLEHIT:=TRUE;GETXNEXT;
PP:=P;QQ:=P;IF D=46 THEN IF P=Q THEN BEGIN D:=47;MEM[Q+6].INT:=65536;
T:=65536;END;END{:829}ELSE BEGIN CYCLEHIT:=FALSE;SCANTERTIARY;
IF ABORTPATH THEN{819:}
BEGIN IF D=47 THEN BADBINARY(P,89)ELSE BADBINARY(P,78);GOTO 22;END{:819}
;{828:}
BEGIN IF(CURTYPE<>11)AND(CURTYPE<>13)THEN PP:=NEWFRAGMENT ELSE PP:=
CUREXP;QQ:=PP;IF MEM[PP].HH.B0=5 THEN BEGIN R:=FIXFRAGMENT(PP);
IF R<>0 THEN BEGIN MEM[R].HH.RH:=GIVENLIST;GIVENLIST:=R;END;
END ELSE BEGIN WHILE MEM[QQ].HH.RH<>PP DO QQ:=MEM[QQ].HH.RH;
IF MEM[PP].HH.B0<>0 THEN BEGIN R:=COPYKNOT(PP);MEM[QQ].HH.RH:=R;QQ:=R;
MEM[PP].HH.B0:=0;MEM[QQ].HH.B1:=0;END;END;END{:828};END;{830:}
BEGIN IF D=46 THEN IF(MEM[Q+1].INT<>MEM[PP+1].INT)OR(MEM[Q+2].INT<>MEM[
PP+2].INT)THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(676);END;BEGIN HELPPTR:=3;HELPLINE[2]:=677;
HELPLINE[1]:=678;HELPLINE[0]:=679;END;PUTGETERROR;D:=47;
MEM[Q+6].INT:=65536;T:=65536;END;IF D=46 THEN{831:}
BEGIN IF MEM[Q].HH.B0=4 THEN BEGIN MEM[Q].HH.B0:=3;MEM[Q+3].INT:=65536;
END;IF MEM[PP].HH.B1=4 THEN MEM[PP].HH.B1:=3;
MEM[Q].HH.B1:=MEM[PP].HH.B1;MEM[Q+5].INT:=MEM[PP+5].INT;
MEM[Q+6].INT:=MEM[PP+6].INT;MEM[Q].HH.RH:=MEM[PP].HH.RH;FREENODE(PP,7);
IF QQ=PP THEN QQ:=Q;END{:831}ELSE BEGIN MEM[Q].HH.RH:=PP;
IF MEM[Q].HH.B1<>1 THEN BEGIN MEM[PP+4].INT:=T;
IF MEM[PP].HH.B0=0 THEN MEM[PP].HH.B0:=4;
IF MEM[Q].HH.B1=0 THEN MEM[Q].HH.B1:=4;END ELSE BEGIN MEM[PP+3].INT:=X;
MEM[PP+4].INT:=Y;MEM[PP].HH.B0:=1;END;END;Q:=QQ;END{:830};
IF CURCMD>=46 THEN IF CURCMD<=47 THEN IF NOT CYCLEHIT THEN GOTO 25;
{832:}IF CYCLEHIT THEN BEGIN IF D=46 THEN P:=Q;
END ELSE BEGIN MEM[P].HH.B0:=0;IF MEM[P].HH.B1=4 THEN MEM[P].HH.B1:=3;
MEM[Q].HH.B1:=0;IF MEM[Q].HH.B0=4 THEN MEM[Q].HH.B0:=3;MEM[Q].HH.RH:=P;
END;MAKECHOICES(P,GIVENLIST);CURTYPE:=11;CUREXP:=P{:832};
IF CYCLEHIT THEN GOTO 10;END{:818}ELSE BEGIN GETXNEXT;SCANTERTIARY;
IF D<>48 THEN DOBINARY(P,C)ELSE BEGIN BACKINPUT;BINARYMAC(P,C,MACNAME);
MEM[C].HH.LH:=MEM[C].HH.LH-1;GETXNEXT;GOTO 20;END;END;GOTO 22;END;
IF CURTYPE=13 THEN{833:}BEGIN CURTYPE:=11;MEM[CUREXP].HH.B0:=0;
MEM[CUREXP].HH.B1:=0;END{:833};10:END;{:817}{834:}PROCEDURE GETBOOLEAN;
BEGIN GETXNEXT;SCANEXPRESSI;IF CURTYPE<>2 THEN BEGIN DISPERR(0,680);
BEGIN HELPPTR:=2;HELPLINE[1]:=681;HELPLINE[0]:=682;END;PUTGETFLUSHE(31);
CURTYPE:=2;END;END;{:834}{1130:}PROCEDURE CLOSEFILESAN;VAR K:INTEGER;
LH:INTEGER;P:HALFWORD;X:SCALED;BEGIN IF INTERNAL[10]>0 THEN{1132:}
IF JOBNAME>0 THEN BEGIN WRITELN(LOGFILE,' ');
WRITELN(LOGFILE,'Here is how much of METAFONT''s memory',' you used:');
WRITE(LOGFILE,' ',STRPTR-INITSTRPTR:1,' string');
IF STRPTR<>INITSTRPTR+1 THEN WRITE(LOGFILE,'s');
WRITELN(LOGFILE,' out of ',MAXSTRINGS-INITSTRPTR:1);
WRITELN(LOGFILE,' ',POOLPTR-INITPOOLPTR:1,' string characters out of ',
POOLSIZE-INITPOOLPTR:1);
WRITELN(LOGFILE,' ',MAXVARUSED:1,'&',MEMEND-2499:1,
' words of memory out of ',2500:1,'&',MEMMAX-2499:1);
WRITELN(LOGFILE,' ',STCOUNT:1,' symbolic tokens out of ',2100:1);
WRITELN(LOGFILE,' ',MAXINSTACK:1,'i,',INTPTR:1,'n,',MAXPARAMSTAC:1,'p,',
MAXBUFSTACK+1:1,'b stack positions out of ',STACKSIZE:1,'i,',MAXINTERNAL
:1,'n,',150:1,'p,',BUFSIZE:1,'b');END{:1132};WAKEUPTERMIN;{1131:}
IF(GFPREVPTR>0)OR(INTERNAL[27]>0)THEN BEGIN{171:}ROVER:=28;
MEM[ROVER].HH.RH:=65535;MEM[ROVER].HH.LH:=2500-ROVER;
MEM[ROVER+1].HH.LH:=ROVER;MEM[ROVER+1].HH.RH:=ROVER;MEM[2500].HH.RH:=0;
MEM[2500].HH.LH:=0;{:171};{1054:}MEM[2501].HH.RH:=24;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN TFMWIDTH[K]:=SORTIN(TFMWIDTH[K])
;NW:=SKIMP(255)+1;DIMENHEAD[1]:=MEM[2501].HH.RH;
IF PERTURBATION>=4096 THEN TFMWARNING(18){:1054};FIXCHECKSUM;
FIXDESIGNSIZ;IF INTERNAL[27]>0 THEN BEGIN{1056:}MEM[2501].HH.RH:=24;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN IF TFMHEIGHT[K]=0 THEN TFMHEIGHT
[K]:=17 ELSE TFMHEIGHT[K]:=SORTIN(TFMHEIGHT[K]);NH:=SKIMP(15)+1;
DIMENHEAD[2]:=MEM[2501].HH.RH;IF PERTURBATION>=4096 THEN TFMWARNING(19);
MEM[2501].HH.RH:=24;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN IF TFMDEPTH[K]=0 THEN TFMDEPTH[K
]:=17 ELSE TFMDEPTH[K]:=SORTIN(TFMDEPTH[K]);ND:=SKIMP(15)+1;
DIMENHEAD[3]:=MEM[2501].HH.RH;IF PERTURBATION>=4096 THEN TFMWARNING(20);
MEM[2501].HH.RH:=24;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN IF TFMITALCORR[K]=0 THEN
TFMITALCORR[K]:=17 ELSE TFMITALCORR[K]:=SORTIN(TFMITALCORR[K]);
NI:=SKIMP(15)+1;DIMENHEAD[4]:=MEM[2501].HH.RH;
IF PERTURBATION>=4096 THEN TFMWARNING(21){:1056};{1062:}
IF JOBNAME=0 THEN OPENLOGFILE;PACKJOBNAME(591);
WHILE NOT TFMBOPENOUT(TFMFILE)DO PROMPTFILENA(888,591);
METRICFILENA:=BMAKENAMESTR(TFMFILE);{1063:}K:=HEADERSIZE;
WHILE HEADERBYTE[K]<0 DO K:=K-1;LH:=(K+3)DIV 4;IF BC>EC THEN BC:=1;
TFMTWO(6+LH+(EC-BC+1)+NW+NH+ND+NI+NL+NK+NE+NP);TFMTWO(LH);TFMTWO(BC);
TFMTWO(EC);TFMTWO(NW);TFMTWO(NH);TFMTWO(ND);TFMTWO(NI);TFMTWO(NL);
TFMTWO(NK);TFMTWO(NE);TFMTWO(NP);
FOR K:=1 TO 4*LH DO IF HEADERBYTE[K]<0 THEN WRITE(TFMFILE,0)ELSE WRITE(
TFMFILE,HEADERBYTE[K]){:1063};{1064:}
FOR K:=BC TO EC DO IF NOT CHAREXISTS[K]THEN TFMFOUR(0)ELSE BEGIN WRITE(
TFMFILE,MEM[TFMWIDTH[K]].HH.LH);
WRITE(TFMFILE,(MEM[TFMHEIGHT[K]].HH.LH)*16+MEM[TFMDEPTH[K]].HH.LH);
WRITE(TFMFILE,(MEM[TFMITALCORR[K]].HH.LH)*4+CHARTAG[K]);
WRITE(TFMFILE,CHARREMAINDE[K]);END{:1064};{1067:}TFMCHANGED:=0;
FOR K:=1 TO 4 DO BEGIN TFMFOUR(0);P:=DIMENHEAD[K];
WHILE P<>24 DO BEGIN TFMDIMENOUT(MEM[P+1].INT);P:=MEM[P].HH.RH;END;
END{:1067};{1068:}FOR K:=0 TO NL-1 DO TFMQQQQ(LIGKERN[K]);
FOR K:=0 TO NK-1 DO TFMDIMENOUT(KERN[K]){:1068};{1069:}
FOR K:=0 TO NE-1 DO TFMQQQQ(EXTEN[K]){:1069};{1070:}
FOR K:=1 TO NP DO IF K=1 THEN IF ABS(PARAM[1])<134217728 THEN TFMFOUR(
PARAM[1]*16)ELSE BEGIN TFMCHANGED:=TFMCHANGED+1;
IF PARAM[1]>0 THEN TFMFOUR(2147483647)ELSE TFMFOUR(-2147483647);
END ELSE TFMDIMENOUT(PARAM[K]);
IF TFMCHANGED>0 THEN BEGIN IF TFMCHANGED=1 THEN PRINTNL(890)ELSE BEGIN
PRINTNL(40);PRINTINT(TFMCHANGED);PRINT(891);END;PRINT(892);END{:1070};
PRINTNL(889);PRINT(METRICFILENA);BCLOSE(TFMFILE){:1062};END;
IF GFPREVPTR>0 THEN{1107:}BEGIN BEGIN GFBUF[GFPTR]:=248;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(GFPREVPTR);
GFPREVPTR:=GFOFFSET+GFPTR-5;GFFOUR(INTERNAL[23]*16);
FOR K:=1 TO 4 DO IF HEADERBYTE[K]<0 THEN BEGIN GFBUF[GFPTR]:=0;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;
END ELSE BEGIN GFBUF[GFPTR]:=HEADERBYTE[K];GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(INTERNAL[24]);
GFFOUR(INTERNAL[25]);GFFOUR(GFMINX);GFFOUR(GFMAXX-1);GFFOUR(GFMINY);
GFFOUR(GFMAXY);
FOR K:=0 TO 255 DO IF CHAREXISTS[K]THEN BEGIN BEGIN GFBUF[GFPTR]:=246;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=K;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(GFWIDTH[K]);
X:=MEM[TFMWIDTH[K]+1].INT;
IF ABS(X)>=MAXTFMDIMEN THEN IF X>0 THEN X:=16777215 ELSE X:=-16777215
ELSE X:=MAKESCALED(X*16,INTERNAL[23]);GFFOUR(X);GFFOUR(CHARPTR[K]);END;
BEGIN GFBUF[GFPTR]:=249;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
GFFOUR(GFPREVPTR);BEGIN GFBUF[GFPTR]:=129;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;K:=4+((GFBUFSIZE-GFPTR)MOD 4);
WHILE K>0 DO BEGIN BEGIN GFBUF[GFPTR]:=223;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;K:=K-1;END;{1085:}
IF GFLIMIT=HALFBUF THEN WRITEGF(HALFBUF,GFBUFSIZE-1);
IF GFPTR>0 THEN WRITEGF(0,GFPTR-1){:1085};PRINTNL(901);
PRINT(OUTPUTFILENA);PRINT(427);PRINTINT(TOTALCHARS);PRINT(902);
IF TOTALCHARS<>1 THEN PRINTCHAR(115);PRINT(903);
PRINTINT(GFOFFSET+GFPTR);PRINT(904);BCLOSE(GFFILE);
IF PSEUDOTYPEIN=0 THEN IF INTERNAL[28]>0 THEN BEGIN K:=SELECTOR;
SELECTOR:=5;POOLPTR:=STRSTART[STRPTR];PRINT(905);PRINT(OUTPUTFILENA);
SELECTOR:=K;
IF POOLPTR<POOLSIZE THEN IF STRPTR<MAXSTRINGS THEN PSEUDOTYPEIN:=
MAKESTRING;END;END{:1107};END{:1131};
IF JOBNAME>0 THEN BEGIN WRITELN(LOGFILE);ACLOSE(LOGFILE);
SELECTOR:=SELECTOR-2;IF SELECTOR=1 THEN BEGIN PRINTNL(914);
PRINT(LOGNAME);PRINTCHAR(46);END;END;
IF(PSEUDOTYPEIN<>0)AND(INTERACTION>0)THEN BEGIN WRITELN(TTY);
FOR K:=STRSTART[PSEUDOTYPEIN]TO STRSTART[PSEUDOTYPEIN+1]-1 DO PTWR1W(0,
ORD(XCHR[STRPOOL[K]]));END;END;{:1130}{1133:}PROCEDURE FINALCLEANUP;
LABEL 10;VAR C:SMALLNUMBER;BEGIN C:=CURMOD;
IF JOBNAME=0 THEN OPENLOGFILE;WHILE CONDPTR<>0 DO BEGIN PRINTNL(915);
IF CURIF=1 THEN PRINT(566)ELSE PRINT(568);
IF IFLINE<>0 THEN BEGIN PRINT(916);PRINTINT(IFLINE);END;PRINT(917);
IFLINE:=MEM[CONDPTR+1].INT;CURIF:=MEM[CONDPTR].HH.B1;
CONDPTR:=MEM[CONDPTR].HH.RH;END;
IF HISTORY<>0 THEN IF((HISTORY=1)OR(INTERACTION<3))THEN IF SELECTOR=3
THEN BEGIN SELECTOR:=1;PRINTNL(918);SELECTOR:=3;END;
IF C=1 THEN BEGIN STOREBASEFIL;GOTO 10;PRINTNL(919);GOTO 10;END;10:END;
{:1133}{1134:}PROCEDURE INITPRIM;BEGIN{186:}PRIMITIVE(280,37,1);
PRIMITIVE(281,37,2);PRIMITIVE(282,37,3);PRIMITIVE(283,37,4);
PRIMITIVE(284,37,5);PRIMITIVE(285,37,6);PRIMITIVE(286,37,7);
PRIMITIVE(287,37,8);PRIMITIVE(288,37,9);PRIMITIVE(289,37,10);
PRIMITIVE(290,37,11);PRIMITIVE(291,37,12);PRIMITIVE(292,37,13);
PRIMITIVE(293,37,14);PRIMITIVE(294,37,15);PRIMITIVE(295,37,16);
PRIMITIVE(296,37,17);PRIMITIVE(297,37,18);PRIMITIVE(298,37,19);
PRIMITIVE(299,37,20);PRIMITIVE(300,37,21);PRIMITIVE(301,37,22);
PRIMITIVE(302,37,23);PRIMITIVE(303,37,24);PRIMITIVE(304,37,25);
PRIMITIVE(305,37,26);PRIMITIVE(306,37,27);PRIMITIVE(307,37,28);
PRIMITIVE(308,37,29);PRIMITIVE(309,37,30);PRIMITIVE(310,37,31);{:186}
{205:}PRIMITIVE(279,47,0);PRIMITIVE(91,52,0);EQTB[2232]:=EQTB[CURSYM];
PRIMITIVE(93,63,0);PRIMITIVE(125,64,0);PRIMITIVE(123,45,0);
PRIMITIVE(58,77,0);EQTB[2234]:=EQTB[CURSYM];PRIMITIVE(322,76,0);
PRIMITIVE(44,78,0);PRIMITIVE(59,79,0);EQTB[2235]:=EQTB[CURSYM];
PRIMITIVE(92,7,0);EQTB[2239]:=EQTB[CURSYM];PRIMITIVE(323,17,0);
PRIMITIVE(324,70,0);PRIMITIVE(315,31,0);EQTB[2240]:=EQTB[CURSYM];
PRIMITIVE(325,72,0);PRIMITIVE(326,58,0);PRIMITIVE(327,18,0);
PRIMITIVE(328,60,0);PRIMITIVE(329,26,0);PRIMITIVE(330,9,0);
PRIMITIVE(316,80,0);EQTB[2241]:=EQTB[CURSYM];PRIMITIVE(331,25,0);
PRIMITIVE(332,6,0);PRIMITIVE(333,68,0);PRIMITIVE(334,11,0);
PRIMITIVE(335,12,0);PRIMITIVE(336,13,0);PRIMITIVE(337,67,0);
PRIMITIVE(338,71,0);PRIMITIVE(339,27,0);PRIMITIVE(340,23,0);
PRIMITIVE(341,15,0);PRIMITIVE(342,10,0);PRIMITIVE(343,16,0);
PRIMITIVE(344,73,0);PRIMITIVE(345,34,0);PRIMITIVE(346,69,0);
PRIMITIVE(347,74,0);{:205}{631:}PRIMITIVE(497,14,1);PRIMITIVE(498,14,2);
PRIMITIVE(499,14,53);PRIMITIVE(500,14,43);PRIMITIVE(501,14,48);
PRIMITIVE(317,14,0);EQTB[2237]:=EQTB[CURSYM];PRIMITIVE(502,4,2394);
PRIMITIVE(503,4,2544);PRIMITIVE(504,4,1);PRIMITIVE(318,4,0);
EQTB[2236]:=EQTB[CURSYM];{:631}{638:}PRIMITIVE(509,61,0);
PRIMITIVE(510,61,1);PRIMITIVE(64,61,2);PRIMITIVE(511,61,3);{:638}{645:}
PRIMITIVE(521,57,2394);PRIMITIVE(522,57,2544);PRIMITIVE(523,57,2694);
PRIMITIVE(524,57,1);PRIMITIVE(525,57,2);PRIMITIVE(526,57,3);{:645}{660:}
PRIMITIVE(537,3,0);PRIMITIVE(462,3,1);{:660}{687:}PRIMITIVE(566,1,1);
PRIMITIVE(314,2,2);EQTB[2238]:=EQTB[CURSYM];PRIMITIVE(567,2,3);
PRIMITIVE(568,2,4);{:687}{823:}PRIMITIVE(672,59,1);PRIMITIVE(673,59,0);
{:823}{835:}PRIMITIVE(222,32,30);PRIMITIVE(223,32,31);
PRIMITIVE(224,32,32);PRIMITIVE(225,32,33);PRIMITIVE(226,32,34);
PRIMITIVE(227,32,35);PRIMITIVE(228,32,36);PRIMITIVE(229,32,37);
PRIMITIVE(230,33,38);PRIMITIVE(212,33,39);PRIMITIVE(231,33,40);
PRIMITIVE(232,33,41);PRIMITIVE(233,33,42);PRIMITIVE(234,33,43);
PRIMITIVE(235,33,44);PRIMITIVE(236,33,45);PRIMITIVE(237,33,46);
PRIMITIVE(238,33,47);PRIMITIVE(239,33,48);PRIMITIVE(240,33,49);
PRIMITIVE(241,33,50);PRIMITIVE(242,33,51);PRIMITIVE(243,33,52);
PRIMITIVE(244,33,53);PRIMITIVE(245,33,54);PRIMITIVE(246,33,55);
PRIMITIVE(247,33,56);PRIMITIVE(248,33,57);PRIMITIVE(249,33,58);
PRIMITIVE(250,33,59);PRIMITIVE(253,33,62);PRIMITIVE(254,33,63);
PRIMITIVE(251,33,60);PRIMITIVE(252,33,61);PRIMITIVE(255,35,64);
PRIMITIVE(43,42,65);PRIMITIVE(45,42,66);PRIMITIVE(42,55,67);
PRIMITIVE(47,54,68);EQTB[2233]:=EQTB[CURSYM];PRIMITIVE(256,44,69);
PRIMITIVE(257,51,71);PRIMITIVE(258,44,70);PRIMITIVE(60,49,72);
PRIMITIVE(259,49,73);PRIMITIVE(62,49,74);PRIMITIVE(260,49,75);
PRIMITIVE(61,50,76);PRIMITIVE(261,49,77);PRIMITIVE(262,36,90);
PRIMITIVE(263,36,91);PRIMITIVE(264,36,92);PRIMITIVE(265,36,93);
PRIMITIVE(266,36,94);PRIMITIVE(267,36,95);PRIMITIVE(268,36,96);
PRIMITIVE(38,46,78);PRIMITIVE(269,44,79);PRIMITIVE(270,55,80);
PRIMITIVE(271,55,81);PRIMITIVE(272,55,82);PRIMITIVE(273,55,83);
PRIMITIVE(274,55,84);PRIMITIVE(275,55,85);PRIMITIVE(276,55,86);
PRIMITIVE(277,55,87);PRIMITIVE(278,44,88);{:835}{947:}
PRIMITIVE(215,29,19);PRIMITIVE(200,29,4);PRIMITIVE(198,29,2);
PRIMITIVE(207,29,11);PRIMITIVE(202,29,6);PRIMITIVE(205,29,9);
PRIMITIVE(210,29,14);PRIMITIVE(211,29,15);{:947}{952:}
PRIMITIVE(759,81,0);PRIMITIVE(760,81,1);{:952}{957:}PRIMITIVE(145,22,0);
PRIMITIVE(146,22,1);PRIMITIVE(147,22,2);PRIMITIVE(765,22,3);{:957}{960:}
PRIMITIVE(766,20,0);PRIMITIVE(767,20,1);{:960}{970:}PRIMITIVE(780,21,0);
PRIMITIVE(781,21,1);PRIMITIVE(782,21,2);PRIMITIVE(783,21,3);
PRIMITIVE(784,21,4);PRIMITIVE(785,21,5);PRIMITIVE(786,21,6);{:970}{984:}
PRIMITIVE(806,66,0);PRIMITIVE(807,66,1);PRIMITIVE(808,66,2);
PRIMITIVE(809,65,6);PRIMITIVE(810,65,16);{:984}{1009:}
PRIMITIVE(839,24,0);PRIMITIVE(840,24,1);PRIMITIVE(841,24,2);{:1009}
{1031:}PRIMITIVE(852,19,0);PRIMITIVE(853,19,1);PRIMITIVE(854,19,2);
PRIMITIVE(855,19,3);PRIMITIVE(856,19,4);{:1031}{1039:}
PRIMITIVE(876,75,0);PRIMITIVE(877,75,128);{:1039}{1099:}
PRIMITIVE(896,28,4);PRIMITIVE(897,28,16);{:1099}{1151:}HASH[13].RH:=12;
EQTB[13].LH:=161;{:1151};END;PROCEDURE INITTAB;VAR K:INTEGER;BEGIN{170:}
{171:}ROVER:=28;MEM[ROVER].HH.RH:=65535;MEM[ROVER].HH.LH:=2500-ROVER;
MEM[ROVER+1].HH.LH:=ROVER;MEM[ROVER+1].HH.RH:=ROVER;MEM[2500].HH.RH:=0;
MEM[2500].HH.LH:=0;{:171};FOR K:=2501 TO 2503 DO MEM[K]:=MEM[2500];
AVAIL:=0;MEMEND:=2503;VARUSED:=28;DYNUSED:=4;MAXVARUSED:=VARUSED;{:170}
{187:}INTNAME[1]:=280;INTNAME[2]:=281;INTNAME[3]:=282;INTNAME[4]:=283;
INTNAME[5]:=284;INTNAME[6]:=285;INTNAME[7]:=286;INTNAME[8]:=287;
INTNAME[9]:=288;INTNAME[10]:=289;INTNAME[11]:=290;INTNAME[12]:=291;
INTNAME[13]:=292;INTNAME[14]:=293;INTNAME[15]:=294;INTNAME[16]:=295;
INTNAME[17]:=296;INTNAME[18]:=297;INTNAME[19]:=298;INTNAME[20]:=299;
INTNAME[21]:=300;INTNAME[22]:=301;INTNAME[23]:=302;INTNAME[24]:=303;
INTNAME[25]:=304;INTNAME[26]:=305;INTNAME[27]:=306;INTNAME[28]:=307;
INTNAME[29]:=308;INTNAME[30]:=309;INTNAME[31]:=310;{:187}{197:}
HASHUSED:=2229;STCOUNT:=0;HASH[2242].RH:=313;HASH[2239].RH:=92;
HASH[2238].RH:=314;HASH[2240].RH:=315;HASH[2241].RH:=316;
HASH[2237].RH:=317;HASH[2236].RH:=318;HASH[2235].RH:=59;
HASH[2234].RH:=58;HASH[2233].RH:=47;HASH[2232].RH:=91;HASH[2231].RH:=41;
HASH[2229].RH:=319;EQTB[2231].LH:=62;MEM[2503].HH.LH:=2239;{:197}{221:}
MEM[24].HH.LH:=2244;MEM[24].HH.RH:=0;{:221}{318:}MEM[2500].HH.LH:=65535;
{:318}{540:}MEM[13].HH.RH:=13;MEM[14].HH.LH:=13;MEM[13].HH.LH:=0;
MEM[14].HH.RH:=0;{:540}{651:}MEM[26].HH.B1:=0;MEM[26].HH.RH:=2242;
EQTB[2242].RH:=26;EQTB[2242].LH:=CURINPUT.NAMEFIELD;{:651}{705:}
EQTB[2230].LH:=87;HASH[2230].RH:=583;{:705}{787:}MEM[2502].HH.LH:=2394;
{:787}{1046:}MEM[25].INT:=1073741824;{:1046}{1057:}MEM[18].INT:=0;
MEM[17].HH.LH:=0;{:1057}{1110:}BASEIDENT:=906;{:1110}END;{:1134}{1136:}
PROCEDURE DEBUGHELP;LABEL 888,10;VAR K,L,M,N:INTEGER;
BEGIN WHILE TRUE DO BEGIN WAKEUPTERMIN;PRINTNL(920);BREAK(TTY);
READ(TTY,M);IF M<0 THEN GOTO 10 ELSE IF M=0 THEN BEGIN GOTO 888;
888:M:=0;{'BREAKPOINT'}
END ELSE BEGIN READ(TTY,N);CASE M OF{1137:}1:PRINTWORD(MEM[N]);
2:PRINTINT(MEM[N].HH.LH);3:PRINTINT(MEM[N].HH.RH);
4:BEGIN PRINTINT(EQTB[N].LH);PRINTCHAR(58);PRINTINT(EQTB[N].RH);END;
5:PRINTVARIABL(N);6:PRINTINT(INTERNAL[N]);7:DOSHOWDEPEND(6);
9:SHOWTOKENLIS(N,0,1000);10:PRINT(N);11:CHECKMEM(N>0);12:SEARCHMEM(N);
13:BEGIN READ(TTY,L);PRINTCMDMOD(N,L);END;
14:FOR K:=0 TO N DO PRINT(BUFFER[K]);16:PANICKING:=NOT PANICKING;{:1137}
OTHERS:PRINT(63)END;END;END;10:END;{:1136}{1145:}
FUNCTION NEXTCOUNT:BOOLEAN;LABEL 30;BEGIN NEXTCOUNT:=TRUE;
WHILE MEMRY.Z<JOBHRL DO BEGIN MEMRY.Z:=MEMRY.Z+1;HACK.Z:=MEMRY.P↑;
IF(HACK.LH=120832)AND(HACK.RH=MEMRY.Z+1)THEN BEGIN MEMRY.Z:=MEMRY.Z+1;
GOTO 30;END;END;NEXTCOUNT:=FALSE;30:END;{:1145}{1146:}
PROCEDURE MAGICBEGIN;VAR SUCCESS:BOOLEAN;I:INTEGER;BEGIN{1144:}
HACK.Z:=77;HACK.Z:=HACK.P↑;JOBHRL:=HACK.RH;MEMRY.Z:=131072;{:1144};
{1147:}RESET(COUNTFILE,COUNTNAME,'/O');
IF NOT EOF(COUNTFILE)THEN BEGIN READLN(COUNTFILE,NUMCOUNTS);
WRITELN(TTY,'Reading in ',NUMCOUNTS:1,' counts');I:=0;
WHILE NOT EOF(COUNTFILE)DO BEGIN SUCCESS:=NEXTCOUNT;
READLN(COUNTFILE,MEMRY.P↑);I:=I+1;END;CLOSE(COUNTFILE);
IF SUCCESS THEN SUCCESS:=NOT NEXTCOUNT;
IF NUMCOUNTS<>I THEN SUCCESS:=FALSE;
IF NOT SUCCESS THEN BEGIN WRITELN(TTY,'Bad counter file length');
GOTO 9999;END;END ELSE BEGIN NUMCOUNTS:=0;
WHILE NEXTCOUNT DO NUMCOUNTS:=NUMCOUNTS+1;
WRITELN(TTY,'Initializing ',NUMCOUNTS:1,' zero counts');END;{:1147};END;
{:1146}{1148:}PROCEDURE MAGICEND;BEGIN{1144:}HACK.Z:=77;HACK.Z:=HACK.P↑;
JOBHRL:=HACK.RH;MEMRY.Z:=131072;{:1144};{1149:}{1144:}HACK.Z:=77;
HACK.Z:=HACK.P↑;JOBHRL:=HACK.RH;MEMRY.Z:=131072;{:1144};
REWRITE(COUNTFILE,COUNTNAME);WRITELN(TTY);
WRITELN(TTY,'Writing ',NUMCOUNTS:1,' count file');
WRITELN(COUNTFILE,NUMCOUNTS);
WHILE NEXTCOUNT DO WRITELN(COUNTFILE,MEMRY.P↑:1);CLOSE(COUNTFILE);
{:1149};END;{:1148}{:1127}{1129:}BEGIN MAGICBEGIN;HISTORY:=3;;
IF READYALREADY=314159 THEN GOTO 1;{14:}BAD:=0;
IF(HALFERRORLIN<30)OR(HALFERRORLIN>ERRORLINE-15)THEN BAD:=1;
IF MAXPRINTLINE<60 THEN BAD:=2;IF GFBUFSIZE MOD 8<>0 THEN BAD:=3;
IF(2500<100)OR(2600>MEMMAX)THEN BAD:=4;IF 1777>2100 THEN BAD:=5;
IF HEADERSIZE MOD 4<>0 THEN BAD:=6;{:14}{148:}
IF(0>0)OR(255<127)THEN BAD:=11;IF(0>0)OR(65535<32767)THEN BAD:=12;
IF(0<0)OR(255>65535)THEN BAD:=13;IF(0<0)OR(MEMMAX>=65535)THEN BAD:=14;
IF MAXSTRINGS>65535 THEN BAD:=15;IF BUFSIZE>65535 THEN BAD:=16;
IF(255<255)OR(65535<65535)THEN BAD:=17;{:148}{198:}
IF 2243+MAXINTERNAL>65535 THEN BAD:=21;{:198}{208:}
IF 2844>65535 THEN BAD:=22;{:208}{304:}
IF 15*11>BISTACKSIZE THEN BAD:=31;{:304}{508:}
IF 20+17*44>BISTACKSIZE THEN BAD:=32;{:508}{723:}
IF 18>FILENAMESIZE THEN BAD:=41;{:723}IF BAD>0 THEN BEGIN;
WRITE(TTY,'Ouch---my internal constants have been',' clobbered!---case '
,BAD:1);GOTO 9999;END;INITIALIZE;IF NOT GETSTRINGSST THEN GOTO 9999;
INITTAB;INITPRIM;READYALREADY:=314159;1:{55:}SELECTOR:=1;TALLY:=0;
TERMOFFSET:=0;FILEOFFSET:=0;{:55}{60:}
WRITE(TTY,'This is METAFONT, Version -10.0');
IF BASEIDENT=0 THEN WRITELN(TTY,' (no base preloaded)')ELSE BEGIN PRINT(
BASEIDENT);PRINTLN;END;{:60}{729:}JOBNAME:=0;{:729}{737:}
OUTPUTFILENA:=0;{:737};{1135:}BEGIN{606:}BEGIN INPUTPTR:=0;
MAXINSTACK:=0;INOPEN:=0;MAXBUFSTACK:=0;PARAMPTR:=0;MAXPARAMSTAC:=0;
FIRST:=1;CURINPUT.STARTFIELD:=1;CURINPUT.INDEXFIELD:=0;LINE:=0;
CURINPUT.NAMEFIELD:=0;FORCEEOF:=FALSE;
IF NOT INITTERMINAL THEN GOTO 9999;CURINPUT.LIMITFIELD:=LAST;
FIRST:=LAST+1;END;{:606}{609:}SCANNERSTATU:=0;{:609};
IF(BASEIDENT=0)OR(BUFFER[CURINPUT.LOCFIELD]=38)THEN BEGIN IF BASEIDENT<>
0 THEN INITIALIZE;IF NOT OPENBASEFILE THEN GOTO 9999;
IF NOT LOADBASEFILE THEN BEGIN WCLOSE(BASEFILE);GOTO 9999;END;
WCLOSE(BASEFILE);
WHILE(CURINPUT.LOCFIELD<CURINPUT.LIMITFIELD)AND(BUFFER[CURINPUT.LOCFIELD
]=32)DO CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;END;
BUFFER[CURINPUT.LIMITFIELD]:=37;FIXDATEANDTI;
INITRANDOMS((INTERNAL[15]DIV 65536)+INTERNAL[14]);{69:}
IF INTERACTION=0 THEN SELECTOR:=0 ELSE SELECTOR:=1{:69};
IF(CURINPUT.LOCFIELD<CURINPUT.LIMITFIELD)AND(BUFFER[CURINPUT.LOCFIELD]<>
92)THEN STARTINPUT;END{:1135};INITSTRPTR:=STRPTR;INITPOOLPTR:=POOLPTR;
HISTORY:=0;IF STARTSYM>0 THEN BEGIN CURSYM:=STARTSYM;BACKINPUT;END;
MAINCONTROL;FINALCLEANUP;9998:CLOSEFILESAN;9999:READYALREADY:=0;
MAGICEND;END.{:1129}